c语言 动态内存管理

综述

c语言在<stdlib.h>头文件中提供了几个内存分配和管理相关的函数

函数 功能
void * malloc(int num); 在堆区分配一块指定大小的内存空间,这块内存空间在函数执行完后不会被初始化,它们的值是未知的
void free(void * address); 释放address所指向的内存块,释放动态分配的内存空间
void *calloc(int num,int size); 在内存中动态分配num个长度为size的连续空间,并将每个字节都初始化为0
void * realloc(void *address,int newsize); 重新分配内存,把内存扩展到newsize

malloc

原型:void * malloc(unsigned int num_bytes);
功能:分配长度为num_bytes字节的内存块,分配的是堆上连续的空间
返回值:如果分配失败,返回空指针;如果分配成功,返回指向被分配内存的指针
返回的是void *指针,可以进行强制类型转换成其他任何类型的指针
使用malloc分配内存后一定要检查内存分配是否成功

int *p=(int *)malloc(4*sizeof(int));
assert(p!=nullptr);

free

原型:void free(void * memblock);
使用free()函数会产生程序崩溃的几种状况:
①访问越界

//越界崩溃
int main()
{
  int *p=(int *)malloc(10*sizeof(int));   //申请10个整型单元内存
  for(int i=0;i<=10;i++) //11个,越界
  {
     p[i]=0;
  }
  free(p);
}

②重复释放内存
③释放非动态内存

int main()
{
   int arr[10];  
   free(arr);  //arr不是动态分配的内存,无法释放
}

calloc

原型:void * calloc(size_t num,size_t size);
功能:在内存的动态存储区中分配n个长度为size的连续空间,并将每个字节置为0。函数返回一个指向分配起始地址的指针;如果分配不成功,返回空指针
注意:calloc分配的内存要用free()对内存进行释放。
calloc & malloc的区别:
①malloc传入一个参数,表示分配的字节数;realloc传入两个参数n和size,分配n个长度为size的连续空间
②malloc只分配内存空间,不初始化,初值是随机值;calloc不仅分配内存空间,而且自动初始化为0

realloc

原型:void *realloc(void *memblock,size_t size);
功能:先判断当前指针指向的内存空间是否有足够的连续空间,如果有,扩大memblock指向的地址,返回memblock。如果空间不够,先按照size指定的大小分配空间,将原来的数据从头到尾拷贝到新分配的内存区域,而后释放原来memblock所指的内存区域,返回新分配的内存区域的首地址。
返回值:如果重新分配成功,则返回指向被分配内存的指针,否则返回空指针

当动态内存不再使用时,应使用free()函数将内存块释放

常见的动态内存错误

①对NULL指针进行解引用操作->忘记检查所请求的内存是否成功分配
②对分配的内存进行操作时越过边界
③用free释放并非动态分配的内存
④释放一块动态分配的内存的一部分->动态分配的内存必须整块一起释放
⑤动态内存使用完不释放->内存泄漏

发布了90 篇原创文章 · 获赞 8 · 访问量 8246

猜你喜欢

转载自blog.csdn.net/weixin_43854189/article/details/102821510