Segfault происходит здесь:
while (input[i - 1] != '\n') ...
Ваш счетчик i
является беззнаковым int.В начале у вас есть i == 0
и i - 1
- это очень большое число, вероятно, 2³² - 1. Это может привести к segfault.
Обратите внимание, что Valgrind говорит, что адрес не был "stack'd,malloc'd».Обычно, если вы выходите за границы массива, он говорит, что адрес, вызывающий сбой, - это «один байт вне памяти malloc'd» или что-то подобное.
Использование беззнаковых целочисленных значений в качестве счетчиков - хороший выбор, ноосторожно, когда вы идете назад.В вашем случае вам вообще не нужно оглядываться назад: вы должны выйти за пределы //
, а затем двигаться вперед столько, сколько потребуется.
В качестве отступления: проверка на strlen()
в циклеусловие не очень хорошая идея в C, потому что strlen
обходит всю строку и ищет нулевой терминатор.Умный компилятор может оптимизировать это, но лучше рассчитать длину строки один раз или, может быть, лучше, проверить, является ли `input [i]! = '\ 0'.
Завершающий ноль - это то, что вам нужноучитывать при пропуске символов с отрицательным условием тоже.Например, недостаточно проверить, является ли текущий символ новой строкой.Вы также должны убедиться, что это не нулевой терминатор:
while (input[i] && input[i] != '\n') i++;