你有一個指針,它是未初始化的(即你不指向任何東西)。作爲所有未初始化的局部變量,它的值是不確定的,可能是隨機的,所以你不知道它指向哪裏。
然後,您嘗試向該隨機位置寫入一個數字,並導致未定義的行爲。未定義行爲是不可預測的,並且它可以工作,它可以導致意想不到的事情發生,它可能崩潰程序,或者它可能甚至引起nasal demons。
您進一步嘗試使用指針作爲一個字符串,一旦增益導致的未定義行爲的兩個實例:一旦因爲指針未初始化,並再次當printf
字節後讀取字節找到字符串結束。
還有未定義行爲的另一種情況,那就是你的main
函數沒有被正確定義。它應該返回一個int
並採取void
參數或int
和char**
參數。這是C規範。沒有合適的main
在技術上是非法的程序,但不幸的是,編譯器讓它滑落很常見。
要在調試器中使用它,你要麼在調試器中運行該程序:
$ gdb ./myProgram
...
(gdb) run
Starting program: /home/someone/myProgram
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400518 in main() at myProgram.c:5
5 *ptr=100;
(gdb)
或者崩潰,並創建一個核心轉儲後,運行使用核心轉儲調試器:
$ ./myProgram
Segmentation fault (core dumped)
$ gdb ./myProgram core
...
Reading symbols from /home/someone/myProgram...done.
[New LWP 4655]
Core was generated by `./myProgram'.
Program terminated with signal 11, Segmentation fault.
#0 0x0000000000400518 in main() at myProgram.c:5
5 *ptr=100;
(gdb)
順便說一下,對於調試信息(調試器讀取的「符號」),程序必須用-g
標誌進行編譯。
問題的措辭有點含糊不清,但我認爲這個問題更多的是關於「如何閱讀核心轉儲文件來確定問題」,以防程序比這個例子更簡單。 – DCoder
@DCoder yes請問我在問什麼...... –
@Q_SaD更新了我的回答 –