Как исправить ошибку «куча была повреждена» во время выполнения? - PullRequest
0 голосов
/ 06 апреля 2019

Я пытаюсь создать код, который получает указатель на массив указателей. Указатели указывают на строки, но каждому из них выделено 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;
}

1 Ответ

0 голосов
/ 06 апреля 2019

Возможные причины

  • Вы никогда не инициализировали friends[i], прежде чем сделать realloc
  • или вы 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 к блоку, освобожденному для более низкого индекса

...