文字列リテラルを変更したために SIGSEGV を取得しており、未定義の動作(SIGSEGV など) を引き起こしています。filename
とname
変数に何を格納する必要があるかわかりません。行ごとの場合:
strcpy(files[count].filename,'.bin');
ファイル名変数に「.bin」を追加するつもりだった場合、このアプローチは間違っています。を使用する必要がありますstrcat
。strcpy
この変数の先頭からファイル名に書き込むため、以前にそこに保存された一部の文字が上書きされます。strcpy
ヌル終了文字も追加するため、それを出力したい場合、printf はその\0
文字で停止し、それ以上進みません。ただし、実際の問題は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
。
編集:
を呼び出すreadConfig(&path, &files);
と、タイプ のポインターが readConfig に渡されますFILES (*)[256]
。FILES files[256];
に変更することを検討してください
FILES* files = malloc(sizeof(FILES)*256);
そして後であなたの関数を次のように呼び出しますreadConfig(&path, files);
次に、 readConfig 関数に互換性のある型の を渡しますfiles
。