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,返回的不一定是空指针(有可能是有可能不是,决定于具体库的实现,也就是说可能会有库返回的是空指针),最后又说,如果返回是空指针的话,是因为申请内存失败(这地方就是矛盾的地方)。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Bill_Hao

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

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

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

打赏作者

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

抵扣说明:

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

余额充值