C语言 得到一个段错误,但不确定是什么原因造成的


#include <stdio.h>

int main () {
int vIn_a, vIn_b, vIn_c;
char vOperator;

printf("Please enter a numbern");
scanf("%d", vIn_a); 
printf("Please enter a numbern");
scanf("%d", vIn_b);
printf("Please enter a Operatorn");
scanf("%c", vOperator);
switch(vOperator){
case '+':
vIn_c = (vIn_a + vIn_b); 
break;
case '-':
vIn_c = (vIn_a - vIn_b);
break;
case '/':
vIn_c = (vIn_a / vIn_b);
break;
case '*':
vIn_c = (vIn_a * vIn_b);
break;
}
printf("Result: %d %c %d = %d", vIn_a, vOperator, vIn_b, vIn_c);
return 0;
}

只是想弄清楚,我运行了gdb。但不确定我的调试器在这一点上告诉我什么。也许我忽略了它?调试器:程序收到信号SIGSEGV,分段错误。0x00007ffff7c60d36 in ??(1) from/usr/lib/lib .so.6

那么是什么导致了这种分割错误呢?我在学C,我迷路了。

提前感谢。

当您使用scanf()时,您不传递要存储值的变量,而是传递指针到变量。

因此,例如,您需要的不是scanf("%d", vIn_a);,而是scanf("%d", &vIn_a);-注意'&'!

scanf()调用的效果,正如您所写的,是将一个任意数字(无论未初始化的vIn_avIn_b中的随机内容是什么)传递给scanf()。它把那些随机的整数值当作指针。所以当它将用户贡献的值写入指针时;它被通过了,它的效果是:

*(int *)vIn_a = user_entered_value;

如果你知道指针的用法,你就会知道这是一个灾难的配方!

还有两个陷阱:

  1. 您的'/'操作符不检查其除数(vIn_b)是否为零,因此如果用户为vIn_b选择零并为操作符选择'/',则很容易崩溃。

  2. 在你的switch语句中没有default:子句,所以如果用户键入的不是你正在检查的操作符字符,vIn_c将包含随机垃圾,因为它在打印时未初始化。

可以使用&例如;scanf("%d", &vIn_a);

文档:https://cplusplus.com/reference/cstdio/scanf/

相关内容