c - 如何修复 "A heap has been corrupted"运行时错误?

标签 c heap-memory

我正在尝试编写一个获取指向指针数组的指针的代码。这些指针指向字符串,但每个字符串都分配有 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;
}

最佳答案

可能的原因是

  • 在执行realloc之前,您从未初始化过friends[i]
  • 或者您重新分配一个已释放的 block
  • 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中,对于给定索引,您可以在为较低索引释放的 block 上应用realloc

关于c - 如何修复 "A heap has been corrupted"运行时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55547917/

相关文章:

c - 为什么这个 MPI 代码执行无序?

css - 如何在 GtkTreeView 中交替亮/暗行?

c - 使用 malloc 探索堆内存

java - 点燃堆不释放,这是内存泄漏吗?

c++ - C++中的堆损坏

c++ - 计算 Linux 上一组进程使用的内存

c - 使用 C 语言的 OS X 剪贴板

c++ - 如何将 ffmpeg 视频帧转换为 YUV444?

java - 由于资源泄漏导致 java 堆空间内存不足问题

java - jmap中显示的 "From Space"和 "To Space"是什么意思?