【问题标题】:How to fix "A heap has been corrupted" run-time error?如何修复“堆已损坏”运行时错误?
【发布时间】:2019-04-06 09:57:10
【问题描述】:

我正在尝试编写一个获取指向指针数组的指针的代码。指针指向字符串,但它们每个都有 50 字节的内存分配给它们,所以我创建了这个函数来分配最小的内存量。但由于某种原因,realloc 会引发运行时错误(堆已损坏)。关于问题根源以及如何解决问题的任何想法?

int reallocToMinSize(char** friends, int len)
{
    int i = 0;
    int reallocSuccess = 1;
    char* newFriendPtr = 0;

    for (i = 0; i < len && reallocSuccess; i++)
    {
        printf("Reallocating: %s, size: %i", friends[i], (strlen(friends[i]) + 1));
        friends[i] = (char*) realloc(friends[i], (strlen(friends[i]) + 1) * sizeof(char));
        if (friends[i] == 0)
        {
            reallocSuccess = 0;
        }
        printf("%s\n", friends[i]);
    }
    return reallocSuccess;
}

【问题讨论】:

  • 需要更多代码来重现问题。
  • is printf("Reallocating: %s, size: %i", friends[i], (strlen(friends[i]) + 1)); 总是打印有效的东西?
  • 如果重新分配失败,并且你将 realloc 的返回值分配给 friends[i],那么你有一个空指针,你不应该在 printf 中使用它。
  • 我怀疑您的 friends[i] 初始值与 realloc 不兼容(我的回答中的第三种情况)
  • 这个诊断的臭名昭著的问题是它是在 代码损坏堆之后触发的。可能在一小时前发生。直到您使用 malloc/realloc 分配更多时您才会发现,只有这样运行时才需要遍历堆以找到更多空间并发现其内部结构受到损害。所以 sn-p 无法帮助我们帮助您,您必须专注于其余代码才能找到错误。

标签: c heap-memory


【解决方案1】:

可能的原因是

  • 您之前从未初始化过friends[i] 来执行realloc
  • 或者你重新分配一个被释放的块
  • friends[i] 未设置为 NULL 或 malloc 的结果

因为你这样做

 realloc(friends[i], (strlen(friends[i]) + 1) * sizeof(char));

而之前的 printf 可能是有效的

friends[i] = "aze";
... 
reallocToMinSize(friends, ...);

char s[...];
... 
friends[i] = s;
... 
reallocToMinSize(friends, ...);

char * s = malloc(...);
... 
friends[i] = s + offset; /* offset not null */
... 
reallocToMinSize(friends, ...);

... 
friends[i] = strtok(...);
... 
reallocToMinSize(friends, ...);

或者可能是第二个错误情况

char * s = malloc(...); /* unique allocation */
...
for (i = ...) { ... friends[i] = s; ... } /* always the same value of s */
... 
reallocToMinSize(friends, ...);

因为 malloc 可以释放它的第一个参数,所以在 reallocToMinSize 中,对于给定的索引,您将 realloc 应用于为较低索引释放的块

【讨论】:

  • friends[i] 确实不是 NULL,它已经填充了字符串,但是它们分配的大小是 50,我想将它减小到最小大小(也就是字符串的大小 + 1),这不是realloc可以做的事情吗?将字符串的大小重新分配为更小/更长的大小,同时保留其数据?
猜你喜欢
  • 2019-12-01
  • 1970-01-01
  • 2013-04-14
  • 2019-08-17
  • 2019-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多