为什么不重新分配工作

时间:2016-01-04 19:19:07

标签: c arrays realloc

我在一个更大的项目中遇到了这个问题,由于某种原因,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},{2}},即使根据我的理解,它应该是{{1}}。

2 个答案:

答案 0 :(得分:5)

调试器不知道arra只是一个指针。如果希望调试器将arra的内容打印为数组,则需要自己遍历元素,或者在打印前将其转换为数组类型。

答案 1 :(得分:0)

首先,你怎么知道realloc什么都没做? realloc(3)不保证返回不同的指针,就好像它可能会尝试重新分配一样。话虽如此,没有办法知道(在malloc外部)它已经做了你喜欢或不喜欢的事情,因为返回值(是同一个指针)没有给你关于新大小的信息。

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

下次,做几个mallocs(不仅是两个)并重新分配所有指向更大值的指针(以避免导致返回相同指针的优化),如下所示:

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");