когда вы возвращаетесь из load var list не установлен, поэтому, когда вы делаете
if(strcmp(list[0], "aasdf"))
у вас неопределенное поведение при использовании list (обычно сбой)
Первое решение - использовать выходную переменную
вам нужно изменить
load(list);
от
load(&list);
и вам нужно изменить тип списка и разыменовать его в load , так:
void load(char ***list)
{
*list = malloc(MAX_NUM_LINES*sizeof(char*));
...
(*list)[line_ct] = malloc((len + 1) * sizeof(char));
strcpy((*list)[line_ct], line);
Я также добавил 1 к len , чтобы иметь место для завершающего нулевого символа.
(правка) Использование *** не очень распространено, как предлагает @ user3629249 в замечании, которое вы можете посмотреть на Тройные указатели в C: это вопрос стиля? внимательно читая ответы.
Второе решение - вернуть выделенный массив:
char** list = load();
с
char ** load()
{
char **list;
...
return list;
также добавляя 1 к len при выделении каждой строки
Кроме того, если вы читаете более MAX_NUM_LINES
строк, вы снова записываете из массива неопределенное поведение, и вызывающий load не знает, сколько строк вы прочитали.
Чтобы избежать этого, вы можете сначала инициализировать список с помощью malloc(0)
, а затем использовать realloc , чтобы увеличить размер списка каждый раз, когда вы читаете строку, что позволяет выделить правильный размер. Чтобы указать размер для вызывающей стороны, вы можете использовать дополнительный выходной var или выделить еще одну запись, чтобы поместить NULL в последнюю запись (все зависит от того, как вы используете массив чтения в коде, вызывающем load )