Здесь вы определяете массив размером 0.
int files = 0;
char* names[files];
Здесь (в то время как i
и files
оба равны 0) вы получаете доступ к первому из этих нулевых элементов (обратите внимание на конфликт здесь?) в массиве.
names[i] = file->d_name;
Затем вы увеличиваете files
.
files++;
Это, однако, не меняет размер массива, и даже если это будет слишком поздно .
Продолжая, я процитирую полезный комментарий WhozCraigs (с разрешения):
Даже исправляя это, вы все еще ожидаете пробуждения. names[i] = file->d_name
будет хранить указатель на память, который не гарантируется и даже не может быть установлен на c в течение всего времени существования перечисления.
Он может / будет использоваться повторно при перечислении каждой записи файла. И даже если это не так, вся эта память гарантированно будет закрыта после запуска closedir.
Если вы хотите сохранить имена файлов, вам необходимо сделать их копии; не просто сохранить указатели.
Конец цитаты.