C語言的段錯誤想必是每個人都遇到過,整理一下,以供學習之用。
今天我執行了一個程序,運行了很長時間後,段錯誤了,我定位了一下,原來是fprintf的問題,具體是vfprintf的問題。
Program received signal SIGSEGV, Segmentation fault. 0x0098735e in vfprintf () from /lib/libc.so.6
調用棧為:
#0 0x0098735e in vfprintf () from /lib/libc.so.6
#1 0x0098e3cf in fprintf () from /lib/libc.so.6
將fprintf換成printf就沒有問題了。
我開始認為是長度問題,導致溢出,後來我組合了各種方案,發現不是長度問題,原來是一個特殊的字符序列導致的問題,這個罪魁禍首就是%20這個字符串,它會導致vfprintf不正常運行。%20其實就是空格的url編碼。
上述主要是因為可變參數列表和格式化字符串的特性導致的,如%20s序列,它會認為是一個字符串,但是我們並沒有傳入一個字符串,所以程序就會有問題。一般來說只要字符串中含有%,就算沒有段錯誤,也會出現很奇怪的輸出現象。
同理,sprintf由於也會調用vfprintf,所以應該同樣也會有問題。