繁体   English   中英

为什么不重新分配工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM