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
下面的语句为什么会影响到程序的执行。
求各位大佬指教啊。。。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.