您的位置:首页 > 其它

c中存储类型,以及调用内存分配函数----细致讲解

2013-07-09 17:52 281 查看
C语言中有4中存储类型:

Auto:内存在栈区和堆区(调用函数),可读,可写

Static:存放在数据段区,可读可写

Register:内存在寄存器区

全局变量:存放在数据段区,可读可写

Auto类型的存储类型变量,主要用在:

1、函数内部,普通变量

2、函数形参列表,变量普通

3、函数内部,块作用区

注意:auto变量时在程序执行的时候分配内存,但是对于数组:

Int a[10];其属于静态数组,即实在编译时就分配内存空间了。

-------------------auto开始未被赋初值,那么其中会是一个随机数---------------------------

Static类型存储类型变量,主要用在:

1、函数外部,静态全局变量

2、函数内部,静态局部变量

对于static的静态变量需要知道几点:

注意一:静态全局变量,如果不是定义在所有函数的顶部,若未被声明,其作用范围,为其定义位置开始的其下所有函数范围。

注意二:静态局部变量,其作用范围,仅仅是在其定义的函数内,而不能被其他函数使用。

注意三:静态变量的,生存周期都是从定义它开始到整个程序的结束

注意四:在编译时就分配内存空间

----------------------------static开始未被赋初值,那么系统会给其赋值为0-------------------

全局变量类型的存储类型变量,主要用在:

1、函数外,如未被声明在别的位置,其作用范围是,当前位置起及其下的所有范围

注意:该变量可以被其他文件用extern来声明在其他文件内使用

---------------------------------------------------全局变量------------------------------------------------

Register类型的存储类型变量:

1、其存储位置是寄存器

2、其与auto变量类似,具有自动存储时期,局部作用域。

3、无法获取地址。

4、没被初始化,其值未定。

5、Double类型变量不能用register存储类型

-------------------------------------------register变量------------------------------------------------

动态内存管理

需要动态存储的原因:有些操作只有在程序运行时才能确定,这样编译器在编译时就无法为他们先分配空间,只能在程序运行时分配。

动态分配内存都是在堆区分配内存的。

在c中:malloc,calloc,realloc,这些函数来动态分配内存,释放是通过free来释放

在c++中:new来动态分配内存,delete来释放内存。

--------对于上面这些存储分配函数,我下面会详细分析:

-------------------------------------malloc和free解读---------------------------------------------------------

函数原型解析:

void *malloc(size_t,size):其头文件是#include<stdlib.h>

解读一:首先该函数的返回值是个void*类型的指针,那么意味着,在给变量,或者是结构体动态分配内存时,需要强转类型

解读二:对于该函数,size_t表示整形,其功能是,分配size个字节大小的空间,如果分配成功,则返回该段内存的首地址,如果size为0,或者分配内存过大,系统不能给予,即不能分配成功,那么返回NULL

其应用有结构体等,因而通过方法函数可以使用该malloc函数创建一个空的链表,针对这个概念,可以看下我写的数据结构源码,里面大量运用了该函数,这里简单概述一下,如下:

Typedef Struct stu{

Char name[20];

Int age;

Long long num;

}student,*stu;

stu stu1=(stu)malloc(sizeof(student))

讲到malloc不得不说原型函数 :void free(void *ptr) 其头文件是#include<stdlib.h>

解析一:free(ptr),这个ptr必须是指向,通过malloc,或者calloc 或者realloc分配的到的内存空间的首地址的

解析二:如果free(ptr)之前已经释放了ptr,那么程序会呈现不可预知的错误。

解析三,该函数原型表明,这个函数是没有返回值得。

-------------------------------------malloc和free解读---------------------------------------------------------

-------------------------------------calloc的解读,其也和free连用-----------------------------------------

函数原型:void *calloc(size_t nmemb,size_t size)

解读一:该函数返回值是一个void *的指针,因而在给动态分配内存是需要强制类型转换。

解读二:这里有两个参数,nmemb和size,他们前者表示要分配变量类型的大小,后者表示要分配几个这个大小的空间,用法如下:

范例

/* 动态配置10个struct test 空间*/

#include<stdlib.h>

struct test

{

int a[10];

char b[20];

}

main()

{

struct test *ptr=calloc(sizeof(struct test),10);

}

解读三:通过calloc得到的空间内存中全都被初始化为0.

一般我用的是malloc这个函数很少用到,注意,这个函数的也用free函数来释放内存空间(这里是内存空间而不是指针,也就是说free后,原来的指针还是指向原来的位置,只是此时他成为了野指针,如需要详细了解野指针等概念,可以查看我写的指针的文章,里面有详细描述)

-------------------------------------calloc的解读,其也和free连用-----------------------------------------





-------------------------------------realloc的解读,其也和free连用-----------------------------------------

该函数的函数原型:void *realloc(void *ptr,size_t size);,

解读一:该函数的返回值是void *类型,因而在动态分配内存是需要强转类型。

解读二:为指针ptr加长size个字节的内存空间。

实例如下:

#include<stdio.h>

2 #include<stdlib.h>

3 int main(){

4 int input,n;

5 int count=0;

6 int *numbers=NULL;

7 int *more_numbers=NULL;

8

9 do{

10 printf("input your value:");

11 scanf("%d",&input);

12 count++;

13

14 more_numbers = (int*)realloc(numbers,count * sizeof(int));

15

16 if(more_numbers != NULL){

17 numbers=more_numbers;

18 numbers[count-1] = input;

19 }else {

20 free(numbers);

21 puts("error reallocating memory");

22 exit(1);

23 }

24

25 }while(input != 0) ;

26 printf("numbers entered:");

27 for(n=0;n<count;n++)

28 printf("%d ",numbers
);

29 free(numbers);

30 return 0;

31 }

-------------------------------------realloc的解读,其也和free连用-----------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐