我刚开始用C语言编码,在作业上遇到了很多困难。 我假设使用 malloc 并自由地使用结构创建记录数据库。这些结构将充当我的数据库。我需要能够添加和删除记录。我也不能为我的结构使用数组,但可以在代码中的其他任何地方使用数组。 老师给了我一个关于如何布置代码的想法,但我不明白如何保存我的输入以将其添加到记录中。 有什么帮助吗??
我注释了很多代码以进行故障排除。 此外,主要底部的两个 printf 语句也用于故障排除。 我可以让它打印出名字,但是一旦我添加姓氏,我就会出现 seg 错误。 我相信我没有为此分配内存,但还没有完全理解这些东西。请帮忙!谢谢!!!!
问题在于"结构记录"类型的"库"变量初始化或实际上缺少它:
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 中删除。
因为您正在将数据读取到未初始化的指针中:
printf ("Please enter your first name:n");
gets(library.fName);
printf ("Please enter your last name:n");
gets(library.lName);
使用malloc
分配内存,并在完成后使用它们并free()
它们。如果不需要指针,可以在struct
中使用数组。
请不要
gets()
,因为它无法防止缓冲区溢出。请改用fgets()
。int main()
应int main(void)
或int main(int argc, char *argv[])
或其等效项。
结构成员分配内存。 为方便起见,首先将它们
定义为
char fName[10];
char lName[10];
etc,
一旦你对此感到满意,然后尝试内存分配。(IOW,一次一个概念(
您遇到的问题是您实际上没有分配任何内存来存储输入。 让我们从您的结构开始:
struct record{
char * fName;
char * lName;
};
在内存中,此结构只是两个字符指针。结构本身的长度为 8 个字节。 指针未初始化为任何内容,因此它们具有随机值。 当您将它们用作指针时,您将指向内存中的随机位置。
如果你想在你的结构中实际存储名字和姓氏,那么你可以像这样创建结构:
static const int MaxNameLength = 255;
struct record{
char fName[MaxNameLength + 1];
char lName[MaxNameLength + 1];
};
或者,您可以按照编写结构的方式使用结构,但为缓冲区分配内存并更新指针。 如果你这样做了,你需要这样做:
static const int MaxNameLength = 255;
struct Record library;
library.fName = (char *)malloc(MaxNameLength + 1);
library.lName = (char *)malloc(MaxNameLength + 1);
这两种方法都是有效的,但第一种方法的优点是您无需自己清理内存。当结构超出范围时,将释放所有内存。 如果您自己恶意标记内存,那么您还需要释放它。
struct record{
char * fName;
char * lName;
//char * sAddress;
//char * city;
//char * state;
//int * zip;
};
在您的结构中,您正在使用 char * fname
但是您的输入法不正确,您必须为此执行 malloc
但是对于C的新手
将 fname 和 lname 保留为字符数组,例如
struct record{
char fName[100];
char lName[100];
//char * sAddress;
//char * city;
//char * state;
//int * zip;
};
现在你上面的代码工作正常..
和 lName 是指针,通常您必须为每个指针分配内存并为每个指针释放内存。如果在指针上读取或写入未分配的内存分段错误,则会发生错误,你可以创建一个像 name[20] 这样的数组并使用 get 函数。将内存分配给 lName 和 fName,如 malloc(strlen(name((。后来最后免费了。尝试在 main 函数中 malloc 和 free,因为它会产生问题(稍后您将通过值传递和按引用问题传递