Слишком много звонков из realloc? - PullRequest
1 голос
/ 22 сентября 2019

У меня есть следующий код C:

char* str = (char*)malloc(sizeof(char));
int count = 0;

while ((c = getchar()) != EOF){
    str[count] = c;
    count++;
    str = (char*)realloc(str, sizeof(str) + sizeof(char));
}

Но выдает ошибку Unhandled exception at 0x77C8F94D (ntdll.dll) in algorithms.exe: 0xC0000374: A heap has been corrupted.Я пытался решить это целую вечность, но не могу понять это правильно.Интересно, что проблема возникает только тогда, когда входной поток имеет большое количество символов для чтения.

Это связано с моим использованием malloc и realloc?

1 Ответ

3 голосов
/ 22 сентября 2019

Исправленный код ниже:

char* str = (char*)malloc(sizeof(char));
int count = 0;

while ((c = getchar()) != EOF){
    str[count] = c;
    count++;
    str = (char*)realloc(str, count * sizeof(char));
}

Однако при этом используется слишком много вызовов realloc!Лучше выделять только в блоках, где я также использовал принцип BPC , а не MNC (см. Комментарии):

size_t limit = 1024u; // For example!
char* str = malloc(limit);
int count = 0;
while ((c = getchar()) != EOF) {
    str[count] = c;
    if (++count >= limit) {
        limit += 1024u;
        char *str2 = realloc(str, limit); // Shouldn't use same pointer ...
        if (!str2) { // ... failure!
            // <Some error message/flag>
            break;
        }
        else str = str2; // Successful realloc
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...