Я пишу программу ac для чтения файлов и каталогов из каталога, а затем указываю количество элементов, найденных в данных структуры и точки имя элементов в динамическом массиве в данных одной и той же структуры. Я сделал это, и его результат правильный. Проблема в том, что при запуске программы появляется сообщение «Ошибка сегментации (core dumped)».C - Указатель на динамический массив в структуре «Ошибка сегментации (сбрасывание ядра)»
Код:
#include <stdio.h>
#include <dirent.h>
#define EXIT_FAILURE 1
typedef struct FileDir
{
int *n_files;
char *file_name[];
} FileDir;
int get_files_within_dir(struct FileDir *fd)
{
DIR *dir;
int n_files;
int index;
n_files = 0;
if ((dir = opendir ("/tmp")) != NULL) {
/* counts all the files and directories within directory */
while (readdir (dir) != NULL) {
n_files++;
}
closedir (dir);
} else {
/* could not open directory */
perror ("");
return EXIT_FAILURE;
}
char *file_name[n_files];
struct dirent *ent;
if ((dir = opendir ("/tmp")) != NULL) {
/* gets all the files and directories within directory */
index = 0;
while ((ent = readdir (dir)) != NULL) {
file_name[index++] = ent->d_name;
}
closedir (dir);
} else {
/* could not open directory */
perror ("");
return EXIT_FAILURE;
}
fd->n_files = n_files;
fd->file_name[0] = file_name[0];
fd->file_name[1] = file_name[1];
fd->file_name[2] = file_name[2];
fd->file_name[3] = file_name[3];
return 0;
}
int main()
{
struct FileDir fd;
get_files_within_dir(&fd);
printf("%d\n", fd.n_files);
printf("%s\n", fd.file_name[1]);
printf("%s\n", fd.file_name[2]);
printf("%s\n", fd.file_name[3]);
return 0;
}
Выход:
[[email protected] src]$ ./file_dir
21
..
geany_socket.fcda02b3
tmpiSdUX3
Segmentation fault (core dumped)
Интересно то, что если я просто указать меньше или равно 2 значений динамического массива данных из struct сообщение об ошибке не отображается. Есть ли у вас какие-либо идеи ?
Спасибо!
попробуйте использовать отладчик – thang