为什么 realloc 不起作用

Why won't realloc work

我在一个更大的项目中遇到了这个问题,由于某种原因,realloc 函数在其中完全没有任何作用。我是否遗漏了一些明显的东西?

这是一个简化的例子:

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

int main()
{
    int x = 1, y = 2, z = 3;
    int* arr, *arr1;
    int** arra;

    arra = (int**)malloc(sizeof(int*));
    arr = (int*)malloc(sizeof(int));
    arr[0] = x;
    arra[0] = arr;
    arra = (int*)realloc(arra, sizeof(int*) + sizeof(int*));
    arr1 = (int*)malloc(sizeof(int));
    arr1[0] = y;
    arra[1] = arr1;

}

当我调试时,最终的 arra{{1}},尽管根据我的理解它应该是 {{1},{2}}

调试器不知道 arra 只不过是一个指针。如果你想让调试器把arra的内容打印成数组,你需要自己遍历元素,或者在打印前强制转换成数组类型。

首先,你怎么知道realloc什么都没做? realloc(3) 不保证返回不同的指针,因为它会尽可能地尝试 realloc。话虽如此,没有办法知道(在 malloc 外部)它做了你喜欢或不喜欢的任何事情,因为 return 值(作为相同的指针)没有给你关于新大小的信息。

顺便问一下,你是怎么检查尺寸是否相同的。您没有显示您在代码中的表现。事实上,从你的代码中你无法获得任何关于实际大小的信息 returned by realloc(只是看看程序是否崩溃了)如果你使用了 sizeof 运算符,你就错了,因为您将它与指针一起使用并且大小 returned 始终相同(指针变量的大小,地址)如果您使用调试器,它与主程序具有相同的资源来检查大小无论 realloc returned(也就是说,什么都没有)那么,得出 realloc 不起作用的结论的推理是什么。

下次,执行多个 malloc(不仅是两个)并将所有指针重新分配到更大的值(以避免优化导致相同的指针 returned),如下所示:

char *a = malloc(10), *b = malloc(10), *c = malloc(10);
char *aa = realloc(a, 10000), *bb = realloc(b, 10000), *cc = realloc(c, 10000);
if (a != aa || b != bb || c != cc) 
    printf("realloc *changed* the return values "
           "(a=%p, aa=%p, b=%p, bb=%p, c=%p, cc=%p)\n", 
             a,    aa,    b,    bb,    c,    cc);
else
    printf("realloc didn't move the return values\n");