【 C 】关于学习 realloc 踩过的那些坑

举报
李锐博恩 发表于 2021/07/15 07:30:51 2021/07/15
【摘要】 在写这篇博文的最后:【 C 】动态内存分配案例分析,我给出了一个不痛不痒的案例,可是运行的结果我一开始没有仔细看,细看让我大吃一惊,这篇博文中我也说了一个大吃一惊的终极原因,那就是我菜!!! malloc先动态分配了一块内存空间,但是后面不够用,原想着就用realloc扩大一下这个内存,我的设想是这样的,如此一来,malloc返回的指针和realloc返回的指针,都应该是那...

在写这篇博文的最后:【 C 】动态内存分配案例分析,我给出了一个不痛不痒的案例,可是运行的结果我一开始没有仔细看,细看让我大吃一惊,这篇博文中我也说了一个大吃一惊的终极原因,那就是我菜!!!

malloc先动态分配了一块内存空间,但是后面不够用,原想着就用realloc扩大一下这个内存,我的设想是这样的,如此一来,malloc返回的指针和realloc返回的指针,都应该是那块内存的首地址,可是事实上并非如此,我以为是我的编译器出了问题,换了几个平台,都是如此。最后,重新温故了这个知识点,让后恍然大悟!

对于这个realloc函数掌握的不太好,这里对上面那个问题专门分析一下,同时对这个函数做出一些总结!


这个例子是:


  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main () {
  5. char *str;
  6. /* Initial memory allocation */
  7. str = (char *) malloc( 15 * sizeof(char) );
  8. strcpy(str, "tutorialspoint");
  9. printf("String = %s, Address = %u\n", str, str);
  10. /* Reallocating memory */
  11. str = (char *) realloc( str, 25*sizeof(char) );
  12. strcat(str, ".com");
  13. printf("String = %s, Address = %u\n", str, str);
  14. free(str);
  15. return(0);
  16. }

运行结果:

String = tutorialspoint,  Address = 8072032
String = tutorialspoint.com,  Address = 8064768

可见,Address的两次值是不一样的,下面解释这个问题。

《C和指针》上说的还是不错的:

realloc 函数用于修改一个原先分配的内存块的大小。使用这个函数,你可以使一块内存扩大或缩小。如果它用于扩大一个内存块,那么这块内存原先的内容依然保留,新增加的内存添加到原先内存块的后面,新内存块并未以任何方法进行初始化。如果它用于缩小一个内存块,该内存块尾部的部分便被拿掉,剩下部分内存的原先内容保留。

如果原先的内存块无法改变大小,realloc将分配另一块正确大小的内存,并把原先那么内存的内容复制到新的块上。因此,使用realloc后,你就不能再使用指向旧内存的指针,而是应该改用realloc所返回的新指针。

上面加粗的这段话就解释了上面的那个问题。

我现在还有个疑问:如何使用realloc来缩小一个已经动态分配好内存的空间?

后面填坑!

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/82626191

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。