【问题标题】:Why won't realloc work为什么不会重新分配工作
【发布时间】:2016-04-08 11:38:39
【问题描述】:

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

【问题讨论】:

  • 你需要#include &lt;stdlib.h&gt;。和(int*)realloc --> (int**)realloc
  • @BLUEPIXY 这正是不投malloc()的原因之一。
  • 另外,不要直接这样realloc(),在某些情况下代码会导致内存泄漏和/或数据丢失。
  • 我认为调试器不知道你分配了多少。尝试用arr=malloc(2*sizeof(int)); arr[0]=x; arr[1]=z; 替换arr=malloc(sizeof(int)); arr[0]=x;,看看调试输出是否改变。

标签: c arrays realloc


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    顺便问一下,你是如何检查尺寸是否相同的。你没有在你的代码中展示你是如何做的。实际上,从您的代码中,您无法获得 realloc 返回的实际大小的任何信息(只需查看程序是否完全崩溃)如果您使用了 sizeof 运算符,那么您错了,因为您使用的是指针和如果您使用调试器,返回的大小总是相同的(指针变量的大小,地址),它与主程序具有相同的资源来检查返回的 realloc 的大小(也就是说,什么都没有)所以,得出 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");
    

    【讨论】:

      猜你喜欢
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 2022-09-24
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      相关资源
      最近更新 更多