Я работаю над функцией чтения полной строки из stdin
в char*
с использованием getchar()
, и в основном это работает, но когда я ввожу более длинную строку, я получаю
realloc(): неверный следующий размер: 0x00000000007ca010
Вот функция:
char *readCMDLine() {
char *cmdline = malloc(sizeof(char));
int counter = 0;
char c;
while (c != 10) {
c = getchar();
cmdline = realloc(cmdline, sizeof(cmdline) + sizeof(char));
cmdline[counter] = c;
counter++;
}
return cmdline;
}
Есть ли способ исправить это, чтобы я мог читать с ним большие строки?
sizeof(cmdline)
. Это может быть не то, что вы ожидаете. Также неразумно перераспределять после каждого символа. - person Sami Kuhmonen   schedule 03.01.2016sizeof(cmdline)
->counter + 1
- person Ed Heal   schedule 03.01.2016c
должно бытьint
2) Вместо использования чисел, таких как 10, используйте'\n'
вместо этого 3)char c; while(c != 10)
Будет ли условие истинным или ложным в первой итерации? 4) Вы не завершили буфер NUL. - person Spikatrix   schedule 03.01.2016c
. Таким образом, программа может случайным образом ничего не возвращать, еслиc
случайным образом инициализируется значением 10. Также не завершается строка с помощью'\0'
и добавляется новая строка к возвращаемому значению. Это может быть как задумано, но очень нестандартная обработка строк. - person Persixty   schedule 03.01.2016getline()
с соответствующими параметрами. Не нужно заново изобретать велосипед. - person user3629249   schedule 04.01.2016sizeof(cmdline)
- это размер указателя (обычно 4 или 8 байтов). Предлагается сохранить счетчик количества выделенных в данный момент байтов памяти и передать этот счетчик как часть второго параметра вrealloc()
всегда присваивать возвращаемое значение изrealloc()
временному указателю. , затем проверьте (!=NULL) этот временный указатель, чтобы убедиться, что операция прошла успешно, прежде чем назначать указательcmdline
. В противном случае при сбоеrealloc()
текущий указатель на выделенную память будет потерян, что приведет к утечке памяти, а использование этого сбойного указателя приведет к событию сбоя сегмента. - person user3629249   schedule 04.01.2016