【问题标题】:dynamic allocation for variable in struct结构中变量的动态分配
【发布时间】:2021-07-06 08:41:25
【问题描述】:

我正试图找出我的问题出在哪里,但似乎找不到, 我想为结构中的变量分配动态内存, 我已经尝试了各种方法,但它不起作用 我收到警告:发生了异常。分段错误

当我为 *bookcase 分配内存时,它的工作原理,但是当我尝试分配给结构中的变量时,我收到了警告。

我尝试做的示例

struct book
 {
  int num;
  char* book_name;
 }*bookcase;

void addbook(void)
 {
  char buff[20];
  gets(buff);
  bookcase->book_name = ( char *)malloc(strlen(buff));
  strcpy(bookcase->book_name,buff);
 }

抱歉这个问题感觉很愚蠢,不幸的是我无法理解这个问题, 任何帮助,将不胜感激。谢谢。

【问题讨论】:

标签: c malloc dynamic-memory-allocation


【解决方案1】:

你没有分配足够的内存。

C 中的字符串以空字节终止。您分配的空间量不考虑该空字节,因此您在复制字符串时写入已分配内存的末尾。这会触发undefined behavior,在这种情况下会导致崩溃。

分配时为空字节添加空间:

bookcase->book_name = malloc(strlen(buff) + 1);
strcpy(bookcase->book_name,buff);

或者,如果您的系统支持,请使用strdup,它会一步完成分配和复制:

bookcase->book_name = strdup(buff);

【讨论】:

  • 可能想要解决这样一个事实,即bookcase 只是一个指向struct book 类型的未初始化指针,所以bookcase->book_name 是未定义的行为(甚至在你得到太短的分配之前)。
  • @DavidC.Rankin 没有显示调用addbook 的代码,并且问题提到了为bookcase 分配内存,因此可以假设这是正确完成的。
  • 好点。但根据显示出来的情况。
【解决方案2】:
  1. 您需要为结构本身分配内存
bookcase = malloc(sizeof(*bookcase));

那么你需要为标题分配足够的内存。您没有分配足够的字符串,因为 C 中的字符串由公牛字符终止,并且此 nill 字符不计入 strlen

bookcase -> book_name = malloc(strlen(buff) + 1);

但你不会为此分配两次。

struct book
 {
  int num;
  char book_name[];
 };

struct book *addbook(void)
 {
  char buff[20];
  struct book *bookcase;
  fgets(buff, sizeof(buff), stdin); 
  /* you should check for errors in all I/O operations and memory allocations */
  bookcase = malloc(sizeof(*bookcase) + strlen(buff) + 1);
  strcpy(bookcase->book_name,buff);
  return bookcase;
 }

【讨论】:

    猜你喜欢
    • 2018-12-29
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 2015-07-23
    • 2020-11-28
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多