"bus error" 和 "Segmentation fault" 以及包含 C 结构的最少代码
"bus error" and "Segmentation fault" with a minimal code containing a struct in C
我写了一个最小的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)时它工作正常。任何解释都将适用。
tmp
是一个不指向任何地方的指针。它是 uninitialized,意味着它的值是 indeterminate。因此,当您将此指针传递给 scanf
时,它会尝试取消引用此无效指针。这会调用 undefined behavior,在您的情况下会导致程序崩溃。
将 tmp
更改为一个足够大的数组以容纳您想要的值,并确保以 scanf
格式指定最大字段大小:
char tmp[50];
scanf("%49s", tmp);
我写了一个最小的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)时它工作正常。任何解释都将适用。
tmp
是一个不指向任何地方的指针。它是 uninitialized,意味着它的值是 indeterminate。因此,当您将此指针传递给 scanf
时,它会尝试取消引用此无效指针。这会调用 undefined behavior,在您的情况下会导致程序崩溃。
将 tmp
更改为一个足够大的数组以容纳您想要的值,并确保以 scanf
格式指定最大字段大小:
char tmp[50];
scanf("%49s", tmp);