我在一个更大的项目中遇到了这个问题,由于某种原因,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}}
答案 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");