Запуск приведенного выше кода приводит к ошибке сегментации: 11.
Это может быть из-за
printf(d_array[n]->d_name);
или
free(d_array[n]);
, поскольку n
- это число записей каталога, а d_array[n]
неинициализировано.(Похоже, вы имели в виду d_array[i]
) Также обратите внимание, что вы не должны пытаться освободить указатель, возвращенный readdir()
, так как он вам не принадлежит.В документации конкретно сказано, что вы не должны пытаться освободить ее.Это потенциально применимо к версии, в которой вы просто назначаете указатель самому массиву.
Это также может быть связано с
free(d_array);
, поскольку d_array
сам по себе не выделяется динамически,Вы можете разумно надеяться, что ваш компилятор предупредит об этом.У меня есть.
Я не понимаю, почему d_array[n] = malloc(sizeof(struct dirent))
, дословно из нескольких сообщений на эту тему, имеет эту несовместимую ошибку типа.
Это было быпотому что ваш компилятор не соответствует.Возможно, вы используете компилятор C ++ вместо компилятора C - они не являются взаимозаменяемыми.Это утверждение является абсолютно допустимым C, учитывая объявления, которые находятся в области видимости, где оно появляется в вашем коде.
Приложение: Что касается того, что вы действительно должны делать, если вы собираетесь динамически распределятьпамяти для элементов d_array, на которые нужно указать (и вам следует, если вы вообще используете массив указателей), вам нужно скопировать структуры Point-to-10 * struct dirent
в выделенное пространство, а не назначатьвозвращенные указатели прямо на массив.Это было бы
*d_array[i] = *dir;
, как Пол Огилви впервые указал в уже удаленном ответе.