我知道的是,爲了malloc
指針數組的數組,語法應該是:(INT **)的malloc(的sizeof(INT *))
(int**)malloc(numberOfDesiredElements*sizeof(int*))
不留神,我忘了把numberOfDesiredElements*
在大小前面。這是搞亂我的程序拋出隨機分段錯誤,即有時程序輸出正確,有時它seg故障。
有人可以解釋發生了什麼,當我沒有表明我想要多少插槽?
謝謝!
我知道的是,爲了malloc
指針數組的數組,語法應該是:(INT **)的malloc(的sizeof(INT *))
(int**)malloc(numberOfDesiredElements*sizeof(int*))
不留神,我忘了把numberOfDesiredElements*
在大小前面。這是搞亂我的程序拋出隨機分段錯誤,即有時程序輸出正確,有時它seg故障。
有人可以解釋發生了什麼,當我沒有表明我想要多少插槽?
謝謝!
這只是一個普通的乘法,而不是魔法語法;所以1而不是3
它是乘法?哦... T_T隨機區段故障呢? – Krzysiek 2012-04-15 09:07:58
@Rafcio:如果你說'malloc(sizeof(int))',你得到足夠的內存只有一個int。如果你嘗試在那裏放置不止一個東西,那麼你處於未定義的行爲領域 - 任何事情都可能發生。 (並使用'calloc'來避免這種情況。) – Mat 2012-04-15 09:10:49
如果你假設你有3個空間但只有1的空間,那麼你正在寫入內存,被別的東西使用(可能會破壞一個指針),或者寫入內存根本沒有分配(段錯誤)。 – geekosaur 2012-04-15 09:11:02
分配的空間寫它的更好的方式是
int **p = malloc(numberOfDesiredElements * sizeof *p);
清潔,更易於閱讀,而且你不必擔心直保持你的類型sizeof
表達。這種轉換是不必要的(在C語言中,它在C++中是必需的,但您不應該在C++中使用malloc
),並且如果您沒有範圍內的malloc
的原型,則可以禁止有用的診斷。
至於當你分配的空間少於預期的時候發生了什麼,那麼你超越了定義行爲的範圍。如果你重要的東西被破壞,你會得到一個運行時錯誤。如果你沒有,你的代碼將出現正常工作。
+1 sizeof * p' ... - allthough關於可讀性我傾向於'sizeof(* p)'。 – alk 2012-04-15 16:02:39
語法不應該是這樣的。避免不必要的演員。 – 2012-04-15 09:10:35
如何投射? – Krzysiek 2012-04-15 09:15:45
'malloc'返回一個'void *',它可以隱式轉換爲'int **'。如果缺少malloc的原型,則顯式演員_may_會隱藏一個錯誤。 – 2012-04-15 09:18:21