我刚刚开始使用C编写代码并且在分配时遇到很多困难。我想使用malloc并使用结构自由创建记录数据库。结构将充当我的数据库。我需要能够添加和删除记录。我也 cant 为我的结构使用数组,但可以在代码中的任何其他地方使用数组。老师给了我一个关于如何布局代码的想法,但我不明白如何保存我的输入以将其添加到记录中。任何帮助?
我的很多代码已被注释掉以便进行搜索。还有主要底部的两个printf语句用于故障排除。我可以打印出名字,但是当我添加姓氏时,我得到一个段错误。我相信我没有为此事件分配内存,但还没有完全理解这些东西..请帮助!感谢!!!!
答案 0 :(得分:1)
问题在于“结构记录”初始化类型的“库”变量或实际上缺少它:
struct record library; //this will hold info for user input
fName和lName成员是指向char的未初始化指针。为缓冲区分配内存并初始化这些指针以指向这些缓冲区。未初始化的指针只是指向“某些”内存位置。当您将数据放入该位置时,任何事情都可能发生!或者提供固定大小的缓冲区来代替那些指针:
struct record {
char fName[100];
char lName[100];
};
这应该是第一步。接下来是使用malloc / free作为你的任务说。将struct记录恢复为原始格式,并使用malloc为缓冲区保留内存,然后再将它们传递给任何函数或以其他方式使用它们;像这样
#define BUFSIZE (100)
library.fName = malloc(BUFSIZE);
library.lName = malloc(BUFSIZE);
预约内存后,您可以使用它们,但不要将超过BUFSIZE个字符的数量传递给这些缓冲区。
完成缓冲区后,释放已分配的内存:
free(library.fName);
free(library.lName);
释放缓冲区后,您可能不再使用它们了。 也不要使用gets()。它不为缓冲区溢出提供任何保护,因为最大缓冲区大小不作为参数传递给gets()。它已被弃用,将从即将推出的标准C1X中删除为不安全。
答案 1 :(得分:0)
因为您正在将数据读入未初始化的指针:
printf ("Please enter your first name:\n");
gets(library.fName);
printf ("Please enter your last name:\n");
gets(library.lName);
使用malloc
分配内存并在完成后使用它们free()
。如果您不需要指针,可以在struct
中使用 arrays 。
请不要gets()
,因为它无法阻止缓冲区溢出。请改用fgets()
。
int main()
应为int main(void)
或int main(int argc, char *argv[])
或同等对象。
答案 2 :(得分:0)
您的结构成员都没有分配内存。为方便起见,首先将它们定义为
char fName[10];
char lName[10];
etc,
一旦您对此感到满意,请尝试分配内存。 (IOW,一次一个概念)
答案 3 :(得分:0)
您遇到的问题是您实际上并没有分配任何内存来存储输入。让我们从你的结构开始:
struct record{
char * fName;
char * lName;
};
在内存中,这个结构只是两个char指针。结构本身长8个字节。指针未初始化为任何内容,因此它们具有随机值。当您将它们用作指针时,您将指向内存中的随机位置。
如果您想在结构中实际存储名字和姓氏,那么您可以像这样创建结构:
static const int MaxNameLength = 255;
struct record{
char fName[MaxNameLength + 1];
char lName[MaxNameLength + 1];
};
或者,您可以按照编写它的方式使用struct,但为缓冲区分配内存并更新指针。如果你这样做,你需要这样做:
static const int MaxNameLength = 255;
struct Record library;
library.fName = (char *)malloc(MaxNameLength + 1);
library.lName = (char *)malloc(MaxNameLength + 1);
这两种方法都有效,但第一种方法的优点是你不需要自己清理内存。当struct超出范围时,所有内存都被释放。如果您自己对内存进行malloc,那么您还需要释放它。
答案 4 :(得分:0)
struct record{
char * fName;
char * lName;
//char * sAddress;
//char * city;
//char * state;
//int * zip;
};
在您的结构中,您使用的是char * fname
但你输入的方法不正确你必须为那个
做malloc但对于C的新手
将fname和lname保持为char数组,如
struct record{
char fName[100];
char lName[100];
//char * sAddress;
//char * city;
//char * state;
//int * zip;
};
现在您的上述代码工作正常..
答案 5 :(得分:0)
fName和lName是指针,通常你必须为每个指针分配内存并为每个指针释放空闲内存。如果您读取或写入未分配的指针,则会发生内存分段错误, 你可以创建一个像name [20]这样的数组并使用gets函数。将内存分配给lName和fName,如malloc(strlen(name))。后来免费到最后。尝试malloc并在main函数中释放,因为它可能会产生问题(稍后您将通过值传递并通过引用问题进行学习)