2013-12-10 5 views
0

У меня есть следующий код, который будет печатать все имена файлов из заданного каталога. Но ошибка Segmentation fault (core dumped). У меня нет опыта использования strcpy с указателями.Ошибка сегментации (сбрасывание ядра) при использовании с strcpy

skipping include 

extern int errno; 

typedef struct fileinfo 
{ 
char filename[256]; 
off_t filesize; 
time_t mtime; 
} FILE_INFO; 

int main(int argc, char **argv) { 

DIR *dir; 
struct dirent *d_ent; 
FILE_INFO **file_info; 
int i = 0, j = 1; 

if((dir = opendir("/")) ==NULL) goto err; 

file_info = (FILE_INFO **)malloc(sizeof(FILE_INFO *) * j); 

while((d_ent = readdir(dir)) != NULL) 
{ 
    file_info = (FILE_INFO **)realloc(file_info,sizeof(FILE_INFO *) * j); 
    strcpy(file_info[j]->filename, d_ent->d_name); //Error here Segmentation fault (core dumped) 

    j++; 
} 

for(i =0 ; i > j; i++) 
{ 
    printf("%s\n", file_info[i]->filename); 
} 

free(file_info); 
return 0; 
err: 
printf("Error is : %d : %s", errno, strerror(errno)); 
return 0; 
} 
+3

[Пожалуйста, не набрасывайте возвращаемое значение 'malloc()' и друзей, в C] (http://stackoverflow.com/a/605858/28169). – unwind

ответ

0

Вы должны сначала выделить место для имени файла.

file_info[j]->filename=malloc(strlen(d_ent->d_name)+1); 
strcpy(file_info[j]->filename, d_ent->d_name); 

или использовать функцию strdup, что это сделано для такого рода вещи:

file_info[j]->filename=strdup(d_ent->d_name); 

Несвязанной, но другая ошибка в коде:

for(i =0 ; i > j; i++) 

следует читать

for(i =0 ; i < j-1; i++) 

Было бы намного лучше/легче инициализировать j = 0.

+0

Вы только что отредактировали «char * filename» в «char filename [256]»? Когда имя файла представляет собой массив, вам не обязательно использовать strdup. Ответ Rohans правильный, помните, C массивы начинаются с индекса 0. –

+0

@ Guntran Bohm несовместимые типы при назначении типа 'char [256]' из типа 'char *' – pmverma

+0

См. Мой 1-й комментарий к моему ответу: если вы объявляете char filename [256] вместо char * filename, вы в порядке. Ошибка - это ваш 'j' индексирование из массива. Мой первый ответ был более или менее автоматическим, поскольку так много людей совершают ту же ошибку; я не видел, что это не относится к вам. –

1

Примечание: могут возникнуть другие проблемы, но строка, предложенная вами, имеет ниже проблемы.

При выделении для j элементов, последний элемент доступен в j-1, поэтому обновить строку в

//----------------v 
strcpy(file_info[j-1]->filename, d_ent->d_name); 

вместо

strcpy(file_info[j]->filename, d_ent->d_name); 

Кроме того, вместо использования FILE_INFO ** вы должны использовать FILE_INFO *file_info; (и соответственно обновить другой код).

0

В дополнение к другим ответам файлы в linux не содержат до 255 символов. max - 4095. Возможно, что при переходе к file_info[j]->filename происходит переполнение буфера. Объявите file_info[j]->filename как char* и позвоните strdup() в исходной строке, чтобы его дублировать.

Смежные вопросы