問題は、タイプ「構造体レコード」の初期化の「ライブラリ」変数、または実際にはそれがないことにあります。
struct record library; //this will hold info for user input
fName および lName メンバーは、char への初期化されていないポインターです。バッファにメモリを割り当て、それらのポインタを初期化してそれらのバッファを指すようにします。初期化されていないポインタは、単に「ある」メモリ位置を指しています。その場所にデータを入れると、何でも起こりえます! または、次のようなポインターの代わりに固定サイズのバッファーを提供します。
struct record {
char fName[100];
char lName[100];
};
それが最初のステップとして機能するはずです。次に、割り当てが示すように malloc/free を使用します。構造体レコードを元の形式に戻し、malloc を使用してバッファ用のメモリを予約してから、それらを関数に渡すか、別の方法で使用します。そのようです
#define BUFSIZE (100)
library.fName = malloc(BUFSIZE);
library.lName = malloc(BUFSIZE);
メモリ予約後はそれらを使用できますが、それらのバッファに BUFSIZE を超える文字数を渡さないでください。
バッファの使用が完了したら、割り当てられたメモリを解放します。
free(library.fName);
free(library.lName);
バッファを解放した後は、それらを使用できなくなります。gets() も使用しないでください。最大バッファー サイズが gets() のパラメーターとして渡されないため、バッファー オーバーフローに対する保護は提供されません。これは推奨されておらず、今後の標準 C1X から安全でないものとして削除される予定です。