C 小白一个,求各位大佬关照。问题代码见下:
#include <stdio.h>
int main() {
long i;
long j;
char *ch; // 这里的确是需要初始化
scanf("%s", ch);
i = 0; // 如果把这行注释掉,程序不会报错
j = 0; //
}
执行结果:
root@ubuntu:~# ./a.out
v2ex
Segmentation fault
但是把下面给i
和j
赋值的语句注释掉,或者只注释其中一条,却不会报错了:
root@ubuntu:~# ./a.out
v2ex
我是用objdump -d main.o
查看反汇编的代码:
0000000000400546 <main>:
400546: 48 83 ec 08 sub $0x8,%rsp
40054a: be 00 00 00 00 mov $0x0,%esi
40054f: bf f4 05 40 00 mov $0x4005f4,%edi
400554: b8 00 00 00 00 mov $0x0,%eax
400559: e8 d2 fe ff ff callq 400430 <__isoc99_scanf@plt>
40055e: b8 00 00 00 00 mov $0x0,%eax
400563: 48 83 c4 08 add $0x8,%rsp
400567: c3 retq
400568: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
发现scanf
的ch
指针的地址赋值为0x0
,这里的确是有问题,但是我想不通scanf
下面的语句为什么会影响到程序的执行。
求各位大佬指教啊。。。
实测,全部是SF