Вальгринд "Неверная запись размера 1" - PullRequest
2 голосов
/ 23 мая 2019

Ниже я написал функцию _getstr(), чтобы получить строку при вводе без использования scanf.Однако при запуске valgrind возникает ошибка «Неверная запись размера 1».Это происходит для каждого входа.Что вызывает эту ошибку?

char *_getstr(){
    char *str = NULL;
    int bufsize = 0, c = 0;
    do {
        c = getchar();
        if (c != '\n'){
            str = realloc(str, (bufsize + 1)*sizeof(char));
            str[bufsize++] = c;
        }
    } while (c != '\n');
    str[bufsize] = '\0';
    return str;
}

В основном я делаю это:

char *s1 = _getstr();

Вывод valgrind при вводе ввода такой:

Insert of the first string: hello
==6830== Invalid write of size 1
==6830==    at 0x109294: _getstr (changeJOIN.c:43)
==6830==    by 0x10919B: main (changeJOIN.c:15)
==6830==  Address 0x4a419b4 is 0 bytes after a block of size 4 alloc'd
==6830==    at 0x4839D7B: realloc (vg_replace_malloc.c:826)
==6830==    by 0x109264: _getstr (changeJOIN.c:39)
==6830==    by 0x10919B: main (changeJOIN.c:15)

1 Ответ

3 голосов
/ 23 мая 2019

Когда вы добавляете завершающий нулевой байт, str указывает на bufsize байт, поэтому str[bufsize] = '\0'; записывает один элемент после конца выделенной памяти.Это то, на что жалуется valgrind.

Вам необходимо выделить еще один байт перед добавлением нулевого терминатора.

str = realloc(str, (bufsize + 1)*sizeof(char));
str[bufsize] = '\0';
...