为什么动态分配内存?
int a[5]; //ok
int length = 5;
int a[length]; //不ok
- 数组的长度必须事先指定,而且只能是常量,不能是变量
- 因为数组长度只能是常量,所以它的长度不能在函数运行的过程当中动态地扩充和缩小
- 对于数组所占内存空间无法手动释放,只能在函数运行结束后由系统自动释放,所以在一个函数中定义的数组只能在该函数运行期间被使用
- 动态分配内存就不存在以上问题,因为动态内存是手动释放,理论上可以在任意时刻释放,在释放之前,即便是函数运行结束,其他函数仍可继续使用它。(程序运行结束时系统为该程序分配的所有内存空间都会被释放)
动态分配内存的使用
- 动态分配内存主要涉及到 malloc calloc realloc 三个函数
- 动态分配内存必须指针接收
- 动态分配内存返回类型为 void *
- 动态分配内存可能失败 返回NULL ,使用前应判空
- 动态分配的内存不会自动释放,必须手动释放
- malloc ,分配内存
int *p = (int *)malloc(10); //动态申请10个字节的大小的连续空间,返回的是首地址
- calloc,分配内存并初始化为0,
int *p = (int *)calloc(10,2); //动态申请 10*2 个字节的大小的连续空间,并初始化为0,返回的是首地址
- realloc,动态调整已分配的内存,返回调整后的新分配的连续空间的首地址,同时将调整之前的地址中的值复制到新地址中
int *p = (int *)malloc(20 * sizeof(int));
int *p1 = (int *)realloc(p, 10*sizeof(int));
//扩大已分配的内存,返回已扩大后的新分配的连续空间的首地址,同时将扩大之前的地址中的值复制到新地址中
动态分配内存的释放
- 动态分配的内存不会自动释放,必须手动释放
# include <stdio.h>
# include <stdlib.h>
int main(void)
{
int *p = malloc(sizeof(int));
*p = 10;
printf("p = %p\n", p);
free(p);
printf("p = %p\n", p);
p = NULL;
return 0;
}
释放前后,p 所指向的内存地址是一样的。所以释放后 p 所指向的仍然是那块内存空间。既然指向的仍然是那块内存空间,那么就仍然可以往里面写数据。可是释放后该内存空间已经不属于它了,该内存空间可能会被分配给其他变量使用。如果其他变量在里面存放了值,而现在用 p 往里面写入数据就会把那个值给覆盖,这样就会造成程序错误。所以当指针变量被释放后,要立刻把它的指向改为 NULL。
- 只有动态创建的内存才能用 free 把它释放掉,静态内存是不能用free释放的。静态内存只能由系统释放
网友评论