问题在于“结构记录”初始化类型的“库”变量或实际上缺少它:
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 中删除,因为它不安全。