Вы получаете SIGSEGV из-за изменения строкового литерала, и это вызывает undefined behavior (например, ваш SIGSEGV). Я не уверен, что следует хранить в переменных filename
и name
. Если по линии:
strcpy(files[count].filename,'.bin');
вы хотели добавить».bin' к имени файла переменными, то этот подход является неправильным. Вы должны использовать strcat
. strcpy
будет писать в filename с начала этой переменной, поэтому некоторые ранее сохраненные символы будут перезаписаны. strcpy
также добавляет нулевой символ завершения, поэтому, если вы хотите распечатать его, printf остановится на этом \0
char и больше не пойдет. Однако реальная проблема заключается в том, что вы должны выделить malloc
пространство для переменных в структуре. Тогда вы сможете их модифицировать.
Рассмотрим простой пример:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct file {
char* name;
char* filename;
};
int main(void)
{
struct file x;
x.name = malloc(30);
x.filename = malloc(40);
strncpy(x.name, "copied_string", 13);
printf("%s\n", x.name);
strcat(x.name, "_suffix");
printf("%s\n", x.name);
strcpy(x.name, "erased");
printf("%s\n", x.name);
free(x.name);
free(x.filename);
return 0;
}
выход:
copied_string
copied_string_suffix
erased
Это должно сделать его немного более ясно, что происхождение вашей аварии. Вы также должны рассмотреть возможность использования fgets или getline. Запомнить free
что у вас есть malloc
'd.
EDIT:
Вызов readConfig(&path, &files);
результатов при переходе к readConfig указатель типа FILES (*)[256]
. Рассмотрим изменение FILES files[256];
к
FILES* files = malloc(sizeof(FILES)*256);
, а затем обратитесь к функции, как readConfig(&path, files);
Тогда вы бы перейти к readConfig функционировать совместимый тип files
.
[getline] (http://linux.die.net/man/3/getline)? – Nelfeal
http://stackoverflow.com/search?q=[c]+read+file+into+array –
'& files' имеет тип' FILES * (*) [256] '.Он несовместим с 'FILES **'. Ваш компилятор должен предупредить об этом. –