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下面的语句为什么会影响到程序的执行。
求各位大佬指教啊。。。
