C语言动态内存管理malloc、calloc、realloc、free的用法和注意事项

本文详细介绍了C语言中四种常见的内存管理函数:malloc、calloc、realloc和free的使用方法及注意事项,包括它们的功能、参数、返回值以及如何正确地分配、初始化、调整和释放内存。

1.void* malloc (size_t size);

malloc:分配一块size Byte大小的内存,返回一个指向该块内存开始的指针,指针类型是void。
其中size_t代表无符号整形类型

例如:

  1. int *number;
  2. number = (int *)malloc(sizeof(int));//分配一个大小为sizeof(int)的存储空间,
  3. //返回的指针需要强转成需要的类型
  4. if(NULL == number)//判断调用是否成功,不成功就退出
  5. {
  6. exit(0);
  7. }
  8. *number = 100;//内存里的内容没有被初始化,值不确定,这里要记得初始化
  9. free(number);//用完之后要free,释放内存
  10. number = NULL;//防止出现野指针


如果size是0,那么返回值不确定,取决于不同库的实现,但是返回值必定是不能引用的。
如果调用失败,则返回空指针

2.void* calloc (size_t num, size_t size);

calloc:为一个大小为num的数组分配内存,每个元素的大小是size,把每个元素初始化为0

  1. int *number;
  2. int i = 0;
  3. number = (int *)calloc(3,sizeof(int));//分配一个大小为3*sizeof(int)的存储空间,
  4. //返回的指针需要强转成需要的类型
  5. if(NULL == number)//判断调用是否成功,不成功就退出
  6. {
  7. exit(0);
  8. }
  9. for(;i<3;i++)
  10. {
  11. printf(“address:%d number[%d] = %d\n”,&number[i],i,number[i]);//打印结果是0
  12. }
  13. free(number);//用完之后要free,释放内存
  14. number = NULL;//防止出现野指针


如果size是0,那么返回值不确定,取决于不同库的实现,但是返回值必定是不能引用的。
如果调用失败返回空指针。

3.void* realloc (void* ptr, size_t size);

realloc:改变ptr指向的内存空间的大小,把指向的内存空间的内容移动到新空间里(地址通过函数返回,可能指向原来的地址也可能指向新地址)
ptr指向的内存空间必须是通过malloc、calloc、realloc函数分配的!!!如果ptr是空指针,那么realloc函数的malloc的功能是一样的。

  1. int * number;
  2. int * renumber;
  3. number = (int *)calloc(5,sizeof(int))
  4. if(NULL == number)//判断调用是否成功,不成功就退出
  5. {
  6. exit(0);
  7. }
  8. renumber = (int *)realloc(number,3*sizeof(int));
  9. if(NULL != renumber)//如果分配成功,就让number指向新分配的内存,这样不会造成内存泄漏,
  10. { //因为number原来指向的内存已经被自动回收。
  11. number = renumber;
  12. }
  13. renumber = NULL;
  14. ...
  15. free(number);//这里只需要free number就可以了。
  16. number = NULL;
如果size为0:
1.在C90(C++98)标准里,会回收ptr指针指向的内存,并且返回空指针。
2.在C99(C++11)标准里,会返回一个不能被引用的地址(不确定是不是空指针,取决于不同的库实现)

如果函数调用失败,会返回一个空指针,ptr所指向内存也不会被回收,即会保持原来的ptr不变(地址不变,内容不变)。

如果返回的是空指针:
1.在C90(C++98)标准里可能性有两种:
1).size为0(ptr指向的地址将会被回收);
2).函数没有申请到内存空间(ptr指向的地址将不会改变)
2.在C99(C++11)标准里只有一种可能:函数申请内存空间失败(此处好像和上面的说法有一点点冲突)

4.void free (void* ptr);

free:回收内存
如果ptr不是通过malloc、calloc、realloc函数分配的,会造成不可预测的行为。
如果ptr为空,那么free函数不作任何处理。

  1. int * buffer1, * buffer2, * buffer3;
  2. buffer1 = (int*) malloc (100*sizeof(int));
  3. buffer2 = (int*) calloc (100,sizeof(int));
  4. buffer3 = (int*) realloc (buffer2,500*sizeof(int));
  5. free (buffer1);
  6. free (buffer3);
注:此处是上文所说的冲突的具体原因,
在C99(C++11)里,上面说的如果size为0,返回的不一定是空指针(有可能是有可能不是,决定于具体库的实现,也就是说可能会有库返回的是空指针),最后又说,如果返回是空指针的话,是因为申请内存失败(这地方就是矛盾的地方)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bill_Hao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值