一段简短的C代码报错

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

但是把下面给ij赋值的语句注释掉,或者只注释其中一条,却不会报错了:

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)

发现scanfch指针的地址赋值为0x0,这里的确是有问题,但是我想不通scanf下面的语句为什么会影响到程序的执行。

求各位大佬指教啊。。。

阅读 1.4k
1 个回答

实测,全部是SF

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏