Существует ряд проблем с вашим кодом, но наиболее важным является динамическое распределение.Ваш код не выделяет память для сохранения массива строк (он же массив массива char).
Эта строка:
arr = malloc(sizeof(**arr) * (strlen(s) + 2));
выделяет память для сохранения числа символов (т. Е. strlen(s) + 2
символов) но это не то, что вы хотите.Особенно, если arr
является указателем на указатель на символ.
Простой подход, который вы можете использовать, - это выделить массив указателей на символы, а затем для каждого из этих указателей выделить массив символов.
Это будет:
char** arr = malloc(sizeof(*arr) * NUMBER_OF_WORDS_IN_INPUT);
arr[0] = malloc(NUMBER_OF_CHARACTERS_IN_WORD0 + 1);
arr[1] = malloc(NUMBER_OF_CHARACTERS_IN_WORD1 + 1);
...
arr[NUMBER_OF_WORDS_IN_INPUT - 1] = malloc(NUMBER_OF_CHARACTERS_IN_LAST_WORD + 1);
Затем вы можете сохранить символы в arr
, используя синтаксис
arr[i][j] = SOME_CHARACTER;
без сегфоулатов .(Разумно требуется, чтобы i
и j
находились в пределах выделения).