C语言分配内存:malloc和free
malloc()和free()函数介绍
malloc()和free()的原型都在stdlib.h头文件中,通常要配套使用malloc()用来动态分配内存,free()用来释放内存。
malloc()函数原型:
void *malloc( size_t size );
malloc()函数接收的参数:所需的内存字节数;返回类型为指向void的指针,可用于返回指向数组的指针、指向结构的指针等,所以通常该函数的返回值会被强制转换为匹配的类型。
函数的调用例子如:
double * ptd;
ptd = (double*) malloc(30 * sizeof(double));
free()函数:
free()函数是将内存释放,free()的参数是一个指针,指向由malloc()分配的一块内存。调用如:
free(ptd);
动态分配变长数组
malloc()可以用于程序运行时动态分配变长数组,如:
int max;
double * ptd;
scanf("%d", max);
ptd = (double*) malloc(max * sizeof(double)); // 根据输入max的值,分配一个长度为max的数组
free()的重要性,内存泄露
void test(double ar[], int n){
double *temp = (double *) malloc(n * sizeof(double));
...
// 忘记使用free();
}
调用test()时,创建了指针temp分配一块内存,但没有使用free()释放,但当下次调用该函数时该内存块也无法被再访问和再使用,若多次调用就会出现耗尽所有内存的问题,即内存泄露。
补充知识–存储类别
程序的内存的使用可分为三类:
1、静态变量使用:
在编译时确定,只要程序还在运行就可以访问存储在该部分的数据。
2、自动变量的使用:
随着程序调用函数和函数结束,自动变量所用的内存数量也相应地增加和减少。这部分的内存通常作为栈来处理。
3、动态分配的内存:
在调用malloc()或相关函数时存在,在调用free()后释放。这部分由程序员管理,这部分内存用于动态分配会支离破碎。使用动态内存通常比使用栈内存慢。