使用库函数分配和管理内存。在运行时,分配更多的内存给程序使用,主要工具是malloc函数,这个函数接受一个参数:所需要要的内存字节数。malloc函数会找到合适的空闲内存块,这样的内存是匿名的,即malloc分配了内存后,不会为其赋名,返回动态分配内存块的首字节地址,我们可以将这个地址赋给一个指针变量,使用这个指针访问这块内存。
malloc函数的返回类型通常被定义为指向char的指针。从ANSI C标准开始,C使用一个新的类型:指向void的指针,该类型相当于一个通用指针。malloc可用于返回指向数组的指针、指向结构体指针等,所以通常该函数的返回值会被强制转换为匹配的类型。在ANSI C中,我们应该坚持使用强制类型转换,因为这样可以提高代码的可读性,否则,我们就不容易记住这个指针所指向的实际类型,这样的阅读性就大打折扣。把指针void的指针赋给任意类型的指针完全不用考虑类型匹配的问题。如果malloc申请内存分配失败,会返回空指针。
double* ptd;
ptd = (double*)malloc(30*sizeof(double));
声明数组有三种方式:
- 声明数组时,用常量表达式表示数组的维度,用数组名访问数组的元素。可以用静态内存成功动态创建这种数组。
- 声明变长数组时,用变量表达式表示数组的维度,用数组名访问数组元素,这种数组只能在自动内存中创建。
- 声明一个指针,调用malloc函数,将其返回值赋给指针,使用指针访问数组元素,该指针可以是自动或静态的。
动态分配内存的存储期从调用malloc函数分配内存到调用free函数释放内存为止。malloc函数要和free函数一起使用,free函数的参数是malloc返回的指针,free用于释放之前malloc申请的内存。
静态内存的数量在编译时固定的。在程序运行期间也不会改变。自动变量使用的内存数量在程序执行期间自动增加或减少。但动态分配的内存数量只会增加,除非调用free来进行释放。
分配内存还可用使用calloc函数:
double* buf;
buf = (double*)calloc(100,sizeof(double));
和malloc函数一样, 在ANSI C之前,calloc函数也返回指向char的指针,在ANSI C之后,返回指向void的指针。如果存储不同的类型,应使用强制类型转换运算符。calloc接受两个参数,一个是所需要的存储单元的数量,第二个参数为存储单元的大小(以字节为单位)。
calloc函数有一个特点,会把块中的所位位置都设置为0.calloc函数也需要要用free函数来释放分配的内存。