欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-01-21 19:01:34
...

在写这篇博文的最后:【 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来缩小一个已经动态分配好内存的空间?

后面填坑!