c - 当我尝试向我的结构添加变量时出现段错误

标签 c struct malloc free memcpy

我刚开始用 C 编写代码,在作业中遇到了很多困难。我假设使用 malloc 和 free 来使用结构创建记录数据库。这些结构将充当我的数据库。我需要能够添加和删除记录。我也不能为我的结构使用数组,但可以在代码的其他任何地方使用数组。老师给了我一个关于如何布置代码的想法,但我不明白如何保存我的输入以将其添加到记录中。有帮助吗??

我有很多代码被注释掉以解决问题。 main 底部的两个 printf 语句也用于故障排除。我可以让它打印出名字,但是一旦我添加姓氏,我就会遇到段错误。我相信我不会为此分配内存,但还没有完全理解这些东西......请帮助!谢谢!!!!!!

最佳答案

问题在于“struct record”类型的“library”变量初始化或者实际上缺少它:

struct record library; //this will hold info for user input

fName 和 lName 成员是指向 char 的未初始化指针。为您的缓冲区分配内存并初始化这些指针以指向这些缓冲区。未初始化的指针只是指向“某个”内存位置。当您将数据放入该位置时,任何事情都可能发生!或者提供固定大小的缓冲区来代替那些指针,例如:

struct record {
    char fName[100];
    char lName[100];
};

这应该是第一步。接下来是按照您的作业所述使用 malloc/free。将 struct record 恢复为原始格式并使用 malloc 为您的缓冲区保留内存,然后再将它们传递给任何函数或以其他方式使用它们;像这样

#define BUFSIZE (100)
library.fName = malloc(BUFSIZE);
library.lName = malloc(BUFSIZE);

保留内存后,您可以使用它们,但不要将超过 BUFSIZE 个字符的字符传递给这些缓冲区。

完成缓冲区后,释放分配的内存:

free(library.fName);
free(library.lName);

释放缓冲区后,您可能无法再使用它们。 也不要使用 gets()。它不为缓冲区溢出提供任何保护,因为最大缓冲区大小未作为参数传递给 gets()。它已被弃用,并将因不安全而从即将发布的标准 C1X 中删除。

关于c - 当我尝试向我的结构添加变量时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19167548/

相关文章:

C 打印数组数字

c - 通过 NetLink 发送的数据大小

c++ - 如何用 'malloc' 和 'free' 替换 'new' 和 'delete' ?

c++ - 声明在类中定义的结构

在 C 中复制结构数组

c - 在 C 中分配一个固定一维的二维数组

c - 在 C 中使用 Free() 时的运行时错误

在 Linux 上将 C 程序翻译成汇编 (x86_64)

共享内存中的c结构

arrays - 在go中创建异构json数组