最近在做项目是遇到了 realloc 导致的问题,现在我就简单的将一些 这个memory 分配函数的区别。
首先要明白一点 他们都是在堆中 分配空间,并且分配的都是连续的空间。
malloc 没有什么特别的 就是分配一段连续的地址。
calloc 和malloc 不不同的地方在于他分配完以后就会初始化为0
realloc 就是在原来的基础上重新分配一段, 这里这主意 如果是减小memory的大小 他以保留的变量地址不会发生变化,如果是增大就有可能发生地址改变。他则把原来地址的只完全复制到新的地址。
我们一下面的例子来做个分析:
例如:
typdef struct test_s
{
int test_index;
char test_name[64];
char *test_p;
test_t *p_prv;
}test_t;
char buf[24]="ni hao";
test_t *p= malloc(sizeof(test_t));
给p 赋值; p->test_index = 1; strcpy(p->test-name,"test"); p->test_p=&buf; p->p_ptrv=p;
test_t *p2=realloc(p,sizeof(test_t)*2) 假设原来的p 的末尾没有足够的空间了。
realloc 是把p1 的值 copy 到p2 的。
这样p 中的值 看看看有没有变换,test_index 中村的是1 copy 没问题,test_name 中存的是"test" 复制没问题,test_p指针中纯的是buf 的地址 copy 没问题, 但是p_ptr也是个指针但是问题来了他指向的是自己(它本身是要被realloc的)所以它本身的地址有改变所以一copy 后没用 还是只想原来的地址,这就有问题了。
所以综上所述,在realloc中,原来只想malloc 的指针都不对了(在rellaoc 改变地址是),所以要重新赋值。