如何修复“堆已损坏”运行时错误?

时间:2019-04-06 09:57:10

标签: c heap-memory

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

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;
}

1 个答案:

答案 0 :(得分:0)

可能的原因是

  • 您从没有初始化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

相关问题