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