許多年輕程序員都這樣做,我學會了在代碼中的不同點插入大量「here1」,「here2」等打印到控制檯語句的用處弄清楚我的程序何時會出錯。這種強力調試技術爲我的CS研究節省了很多次。但是,當我開始用C編程時,我偶然發現了一個有趣的問題。如果我試着運行C編程:seg故障,printf和相關的怪癖
void* test;
printf("hello world");
test[5] = 234;
當然,我得到了一個段錯誤,用於沒有爲malloc測試testChar的內存。然而,從邏輯上來說,在seg故障發生之前會打印出「hello world」,因爲這是代碼的流向,但根據我的經驗,seg故障總是首先發生,而「hello world 「永遠不會被打印到控制檯上。 (我無法測試這個確切的例子,但是我已經在Linux機器上多次使用gcc遇到過這種情況)。我猜這與編譯器重新安排一些事情和/或printf使用某種不同步刷新的緩衝區,因此不會立即生效。這完全是我的猜測,因爲我真的不知道爲什麼會發生。在我使用的任何其他語言中,無論「testChar = ...」行產生什麼問題,「hello world」都會被打印出來,因此我可以確定問題所在。
我的問題是爲什麼當我編程C時會發生這種情況?爲什麼不是先打印出你好的世界?其次,是否有比此更好的C編程調試技術來實現相同的基本功能?在中,一種簡單/直觀的方式來查找是問題的代碼行?
編輯:我偶然發現了一個實例哈哈。我現在擁有的應該會導致段錯誤。這很有趣,通常當我不要想要一個segfault我得到一個,現在當我真的想要一個我寫法律代碼!
我曾經這麼想過。*儘管我正在精神上,但會劃傷頭部。 – 2009-06-10 13:10:59
對不起,大聲笑,我解決了我的代碼,這是一個真正的問題。我需要任何會導致段錯誤的東西。 – JoeCool 2009-06-10 13:11:34
「哦,這是壞的廢話」將被存儲在符號區(?)中,並且指針被存儲在testChar中...您可以使用調試器查看它。 – stefanB 2009-06-10 13:12:06