2

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

我有很多代码被注释掉以排除故障。main 底部的两个 printf 语句也用于故障排除。我可以让它打印出名字,但只要我添加姓氏,就会出现段错误。我相信我没有为这种情况分配内存,但还没有完全理解这些东西。请帮忙!谢谢!!!!

4

6 回答 6

1

问题在于“结构记录”初始化类型的“库”变量或实际上缺少它:

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 中删除,因为它不安全。

于 2013-10-03T19:51:20.637 回答
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;
       };  

现在你上面的代码工作正常..

于 2013-10-03T19:41:33.087 回答
0

您遇到的问题是您实际上并没有分配任何内存来存储输入。让我们从你的结构开始:

   struct record{
     char * fName;
     char * lName;
   };         

在内存中,这个结构只是两个 char 指针。结构本身有 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);

这两种方法都有效,但第一种方法的优点是您不需要自己清理内存。当结构超出范围时,所有内存都会被释放。如果您自己 malloc 内存,那么您还需要释放它。

于 2013-10-03T19:38:37.973 回答
0

因为您正在将数据读入未初始化的指针:

   printf ("Please enter your first name:\n");
   gets(library.fName);
   printf ("Please enter your last name:\n");
   gets(library.lName);

malloc完成后使用并使用它们和它们分配内存free()。如果不需要指针,可以struct.

  1. 请不要gets(),因为它不能防止缓冲区溢出。改为使用fgets()

  2. int main()应该是int main(void)int main(int argc, char *argv[])或其等价物。

于 2013-10-03T19:28:01.020 回答
0

您的结构成员都没有分配给他们的内存。为方便起见,首先将它们定义为

char fName[10]; 
char lName[10]; 
etc, 

一旦你对此感到满意,然后尝试内存分配。(IOW,一次一个概念)

于 2013-10-03T19:28:08.067 回答
0

fName 和 lName 是指针,通常您必须为每个指针分配内存并为每个指针释放内存。如果您在未分配内存分段错误的指针上读取或写入,您可以创建一个类似 name[20] 的数组并使用gets函数。像 malloc(strlen(name)) 一样为 lName 和 fName 分配内存。后来免费到底。尝试在 main 函数中使用 malloc 和 free,因为它可能会产生问题(稍后您将了解按值传递和按引用传递问题)

于 2013-10-03T20:16:27.120 回答