【问题标题】:"bus error" and "Segmentation fault" with a minimal code containing a struct in C“总线错误”和“分段错误”,包含 C 中的结构的最少代码
【发布时间】:2021-04-17 22:07:09
【问题描述】:

我写了一个最小的 C 代码如下:

#include <stdio.h>

struct Books {
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};

int main() {
   struct Books Book1;

   char *tmp;
   int counter=0;

   scanf("%s", tmp);
   return 0;
}

当我编译并运行上述代码时,在提供输入后,我收到以下错误:

❯ gcc main.c
❯ ./a.out
e
[1]    86266 bus error  ./a.out
❯ vim main.c
$

当我将上述代码放入函数时,出现“分段错误”。

我不知道这段代码有什么问题。当我注释掉第一行 main(结构的 instatioation)时,它工作正常。任何解释都会被应用。

【问题讨论】:

  • char *tmp 更改为char tmp[1000]

标签: c pointers segmentation-fault scanf bus-error


【解决方案1】:

tmp 是一个不指向任何地方的指针。它是未初始化的,意味着它的值是indeterminate。因此,当您将此指针传递给scanf 时,它会尝试取消引用此无效指针。这会调用undefined behavior,在您的情况下会导致程序崩溃。

tmp 更改为一个足以容纳所需值的数组,并确保以scanf 格式指定最大字段大小:

char tmp[50];
scanf("%49s", tmp);

【讨论】:

  • 但是 scanf 假设也可以与 char * 一起使用,对吧?为什么当我注释掉结构定义时代码有效?
  • @linker 这是未定义行为表现出来的方式之一。看似无关的更改可能会使您的代码崩溃(或不崩溃)。
  • @linker: scanf 期望指针指向有效分配的内存。通过如图所示分配一个数组,或者您可以在堆上分配:char *tmp = malloc(50);
猜你喜欢
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多