鍍金池/ 問答/C/ 一段簡(jiǎn)短的C代碼報(bào)錯(cuò)

一段簡(jiǎn)短的C代碼報(bào)錯(cuò)

C 小白一個(gè),求各位大佬關(guān)照。問題代碼見下:

#include <stdio.h>

int main() {
    long i;
    long j;
    char *ch; // 這里的確是需要初始化
    scanf("%s", ch);
    i = 0;  // 如果把這行注釋掉,程序不會(huì)報(bào)錯(cuò)
    j = 0; //
}

執(zhí)行結(jié)果:

root@ubuntu:~# ./a.out
v2ex
Segmentation fault

但是把下面給ij賦值的語句注釋掉,或者只注釋其中一條,卻不會(huì)報(bào)錯(cuò)了:

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)

發(fā)現(xiàn)scanfch指針的地址賦值為0x0,這里的確是有問題,但是我想不通scanf下面的語句為什么會(huì)影響到程序的執(zhí)行。

求各位大佬指教啊。。。

回答
編輯回答
哚蕾咪

實(shí)測(cè),全部是SF

2018年3月23日 10:27