[英]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外部)它是否已完成您想做的任何事情,因为返回值(是相同的指针)不会为您提供有关新大小的信息。
顺便问一下,您如何检查尺寸是否相同。 您不会显示您在代码中的工作方式。 确实,从您的代码中您无法获得任何由realloc返回的实际大小的信息(只需查看程序是否崩溃)。如果您使用了sizeof
运算符,那么您就错了,因为您将其与指针和大小一起使用如果使用调试器,则返回的值始终是相同的(指针变量的大小,地址),它与主程序具有相同的资源来检查所返回的任何realloc的大小(也就是什么也没有),那么,什么是得出无法重新分配的结论。
下次,执行几个malloc(不仅是两个),并将所有指针重新分配给更大的值(以避免优化导致返回相同的指针),如下所示:
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");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.