-1
我正在初始化一個帶有1字節內存的空指針,並將其類型轉換爲一個int指針並將其解除引用給它一個值3(它需要4個字節),但它運行良好。不應該導致錯誤或導致像OOM一樣的運行時異常?類型將一個void指針轉換爲內存分配不足的int值
void* record = malloc(1);
int i=3;
*((int*)record) = 3;
我正在初始化一個帶有1字節內存的空指針,並將其類型轉換爲一個int指針並將其解除引用給它一個值3(它需要4個字節),但它運行良好。不應該導致錯誤或導致像OOM一樣的運行時異常?類型將一個void指針轉換爲內存分配不足的int值
void* record = malloc(1);
int i=3;
*((int*)record) = 3;
當你寫過去由malloc
分配的內存塊的結尾,你在這裏所做的,你調用undefined behavior。
未定義的行爲意味着程序的行爲無法預測。它可能會崩潰,它可能會輸出奇怪的結果,或者它可能看起來正常工作。另外,一個看起來不相關的變化,例如添加一個未使用的局部變量或調用printf
來調試,可以改變未定義行爲的體現方式。
總之,有不確定的行爲,不能因爲程序可能暴跌並不意味着它會。
當你誤用這樣的指針時,它是*未定義的行爲*。它可以做任何事:工作與否,是否崩潰,給你一個編譯器警告與否等。 –
「這不應該是理想的異常嗎?」那將是_defined behavior_。爲什麼要定義語言如何失敗? – chux
這裏令人討厭的事實是,不確定與否,它實際上可以用於大多數C++實現,因爲幾乎所有堆實際上都是以機器字或機器字的一小部分爲單位進行分配的。也就是說,你會發現你的堆實際上分配了4或者8或者12或者甚至16個字節用於你的'malloc(1)'調用。 (例外情況是那些非常少見的堆,它們將堆元數據與分配的內存分開,或者對於分配少於一個機器字的分配有特殊的處理。)討厭的原因是它幾乎總是能夠工作。直到有一天,事實並非如此。 – davidbak