当前位置: 代码迷 >> 综合 >> linux malloc calloc realloc 的区别
  详细解决方案

linux malloc calloc realloc 的区别

热度:24   发布时间:2024-01-12 22:55:03.0

最近在做项目是遇到了 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 改变地址是),所以要重新赋值。