动态内存分配
内存
变量的内存使用方式
栈区 局部变量 函数的形参
堆区 动态内存分配
静态区 全局变量 静态变量
四个函数(在堆区上申请空间)
malloc() 开辟内存块
向内存中申请10个整形的空间 记得强转
int*p=(int*)malloc(10*sizeof(int));
malloc 返回值 开辟成功是返回开辟的(首)地址,开辟失败时返回NULL
开辟失败的原因->>超出内存大小限制
当动态申请的系统不在使用时,就应该还给操作系统—————free()
free() 回收不在使用的内存块
free§;后 p所指向的内存块已经释放,but任可以通过p找到这个内存块
所以应 free§; p=NULL;
倘若free()内的参数指向的空间不是动态开辟的,那么free函数的行为是未定义的,eg:数组就不能用free函数释放内存
所以 malloc()和free()经常配合使用
calloc() 开辟内存块且初始化为0
int*p=(int*)calloc(10,sizeof(int));
realloc() 调整动态开辟的内存
int*p=(int*)malloc(10*sizeof(int));
int*p=realloc(p.20);
int*p=realloc(p.20000);
//p的值可能会发生改变
note:
1.如果参数指向的空间之后有足够的内存空间可以追加,则可以直接追加,返回p
2.如果参数指向的空间之后没有足够的内存空间可以追加,那么realloc函数会重新找一个新的内存区域,开辟符合需求的空间,并且会把原来内存中的数据拷贝过来,释放旧的内存空间,最后返回新开辟的内存空间地址
故realloc函数的返回值有可能发生改变
3.要用新的变量来接受realloc的返回值
如果realloc函数调整失败,会返回空指针NULL, 倘若用原有变量接受返回值的话,会导致原有数据丢失
int*ptr=realloc(p.X);
if (ptr!=NULL)
{
p=ptr;
}//X指要增加的内存大小
常见的动态内存操作
1.对空指针进行解引用操作
2.对动态开辟内存的越界访问
3.对非动态开辟内存的free
4.使用free函数释放动态内存的一部分
5.对同一块内存多次释放
6.忘记释放动态开辟内存(内存泄漏)(程序崩溃)
note :
1.用realloc函数实现malloc函数
int *p=realloc(NULL,40);//等价于malloc