这篇主要说一说C语言中几个分配内存的函数:malloc(),calloc()和free()
内容在书12.4章.
C语言可以通过库函数分配和管理内存.下面的代码都为变量分配了一些内存.
float f;
char str[] = "This is a String";
int arr[100];
静态数据在程序载入内存时分配内存.自动数据程序执行代码块时分配,离开代码块时销毁.
同时,C语言还可以在程序运行时分配更多的内存.
1. malloc()
这个函数接收一个参数: 需要分配的字节数.
函数原型在stdlib.h中.
这个函数会找到合适的空闲内存块分配内存,这样的内存是匿名的,也就是通过malloc()函数分配的内存不会被赋名.不过通常要与下面介绍的free()函数一起使用.
返回值是动态分配的内存块的首字节地址.通常是指向char的指针.
ANSI C标准开始,出现了新的类型:指向void的指针,相当于通用指针.将void指针赋给任意类型的指针不需要考虑类型匹配的问题.malloc()的返回值也从char*变为void*.
下面的代码用malloc()函数创建了一个容量为10的double数组.
double* dp;
dp = (double*)malloc(10 * sizeof(double));
算上这种方式,现在有3种方法创建一个数组.
int arr[32];
声明时用常量表达式表示数组维度,用数组名访问数组的元素.可以用静态内存或动态内存创建这种数组.
int base = 10;
int arr[2 * base];
C99新特性:声明变成数组,用变量表达式表示数组的维度,用数组名访问数组的元素.只能在自动内存中创建.
int* pi;
pi = (int)malloc(32 * sizeof(int));
声明一个指针,并用malloc()分配内存,将返回值赋值给指针,可以是静态的也可以是自动的.
由于返回的是void*,所以通常需要强制类型转换.
2.free()
函数原型在stdlib.h中.
该函数的参数是malloc()函数返回的地址,以用来释放malloc()分配的内存.所以动态内存的存储期是从调用malloc()到free()释放内存为止.
需注意,free()只能释放malloc()和后面提到的calloc()分配的内存.
free()应该位于程序的末尾,来释放malloc()分配的内存.
注意,有些系统会扎起程序结束时自动释放动态分配的内存,有些系统则不会.所以保险起见,无论什么时候都要使用free().
int* p;
p = (int)malloc(32 * sizeof(int));
...
free(p);
3.calloc()
这个函数与前面提到的malloc()类似,ANSI之前,返回char*,ANSI之后,返回void*.
用法也一样,首先定义一个指针,再分配内存.不过参数有所不同.
int* p;
p = (int)alloc(32, sizeof(int));
// ↑所需的存储单元数量 ↑每个单元的大小