2015-02-22 2 views
0

Я пишу программу 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 сообщение об ошибке не отображается. Есть ли у вас какие-либо идеи ?

Спасибо!

+2

попробуйте использовать отладчик – thang

ответ

0

У вас есть 2 проблемы, которые могут быть причиной сегментация FAULT

  1. Поле n_files является указателем, и вы назначили целое к нему, он должен быть объявлен как

    int n_files; 
    
  2. Вы никогда не выделяете место для поля file_name, вы должны хотя бы предоставить фиксированный размер, например,

    char *file_name[1000]; 
    

    Вы могли бы выделить память динамически, используя malloc(), но это другое дело, и для этого требуется объяснение.

примечание: включение warnigns компилятора поможет вам предотвратить глупые ошибки, как int *n_files и затем делать fd->n_files = n_files;.

0

n_files не должен быть указателем

typedef struct FileDir 
{ 
int n_files; 
char *file_name[]; 
} FileDir; 

Тогда ваша линия

printf("%d\n", fd.n_files); 

не врезаться. Попробуйте просмотреть структуру с помощью отладчика