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

版权声明:本博客内容来自于个人学习过程中的总结,参考了互联网以及书本、论文等上的内容,仅供学习交流使用,如有侵权,请联系我会重写!转载请注明地址! https://blog.csdn.net/Reborn_Lee/article/details/82626191

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

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

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


这个例子是:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main () {
   char *str;

   /* Initial memory allocation */
   str = (char *) malloc( 15 * sizeof(char) );
   strcpy(str, "tutorialspoint");
   printf("String = %s,  Address = %u\n", str, str);

   /* Reallocating memory */
   str = (char *) realloc( str, 25*sizeof(char) );
   strcat(str, ".com");
   printf("String = %s,  Address = %u\n", str, str);

   free(str);

   return(0);
}

运行结果:

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

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

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

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

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

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

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

后面填坑!

猜你喜欢

转载自blog.csdn.net/Reborn_Lee/article/details/82626191