【 C 】关于学习 realloc 踩过的那些坑
在写这篇博文的最后:【 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来缩小一个已经动态分配好内存的空间?
后面填坑!