2014-03-01 35 views
0

今天早上我剛剛與C的行爲感到驚訝(這真的讓我感到驚訝。)爲什麼字符指針不給分段錯誤?

如果我寫這樣的代碼:

char *txt; 
strncpy(txt,"hello",4); 
printf("%s\n",txt); 

後來我才知道,它將使分割的錯,因爲我沒有將內存分配給'txt'指針。好的....現在看到這個代碼:

char *txt = (char *) calloc(0,sizeof(char)); 
strncpy(txt,"hello",4); 
printf("%s\n",txt); 

直到現在我還分配0字節爲「TXT」,但我只能驚訝它爲什麼不給段錯誤,而不是給段錯誤,它是給予正確答案「地獄」。

任何人都可以解釋我這樣的C類行爲嗎?

+0

嘗試調用'免費(txt)',看看會發生什麼...... – pat

+0

當m調用free(txt)時,每件事情都很好,我的意思是沒有錯誤即將到來,它給出了正確的答案。 @拍 – sdream

回答

0

我猜想,操作系統已實際分配比請求的字節數量更多,你寫到,或操作系統返回一些指針不會導致段錯誤。

根據http://en.cppreference.com/w/cpp/memory/c/calloc

如果大小是零,則該行爲

定義實現(空指針可以被返回,或者某些非空指針可以被返回可能不被用於訪問存儲)

顯然你應該不是依靠這個。

1

A段錯誤是從來沒有保證由C標準。一般來說,只有「未定義的行爲」:如果您執行X,則允許發生任何事情。有時候,在某些操作系統上,您會遇到段錯誤。但也許你會「幸運」,沒有什麼不好的事情發生。或者你腐蝕一些你稍後會用到的內存,導致你的程序崩潰沒有明顯的原因。

在這種情況下,未定義的行爲是由您寫入您尚未分配的內存引起的。也許它工作,也許它不。