問題在於式「結構記錄」初始化「庫」變量或實際上它的不足:
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中移除爲不安全的。