calloc(清零配置)
/ SEE-alock /
calloc 是 malloc 比較整潔的表親。malloc 交給你一塊裝滿殘餘垃圾的區塊,而 calloc 交給你一塊每個位元組都設為零的區塊。這名字通常讀作 cleared allocate(清零配置)。它接受大小的方式也略有不同、往往更安全:你分別告訴它有幾個項目、每個項目多大。
精確地說:calloc(count, size) 保留一塊足以容納 count 個各為 size 位元組之物件的區塊——也就是總共 count * size 個位元組——並在回傳指標前把該區塊的每個位元組都設為零。對一個剛配置的整數陣列而言,這代表每個元素一開始都是 0;對一個結構而言,代表每個欄位一開始都被清零(整數是 0,指標在一般平台上是空指標)。還有第二個不張揚的好處:因為 calloc 自己做 count * size 的乘法,它能偵測溢位。若 count * size 會環繞超過可表示的最大尺寸,正確的 calloc 會回傳 NULL 而非配置一塊太小的區塊——這比你自己手寫 malloc(count * size) 真正安全,因為手寫時乘法可能默默溢位,給你一個遠比你預期還小的緩衝區。
何時該用 calloc:任何你希望記憶體一開始就處於已知、乾淨狀態的時候——計數器歸零、旗標為假、指標為空——這樣你就不必自己初始化。何時 malloc 就夠了:當你反正即將覆寫每個位元組時,這時清零是白做工。和 malloc 一樣,calloc 失敗時回傳 NULL 必須檢查,且這塊區塊最終必須用 free() 釋放。
int *scores = calloc(100, sizeof(int)); /* 100 個 int,全為 0 */ if (scores == NULL) return -1; /* 對每個 i,scores[i] 已經是 0 */ free(scores);
calloc(count, size) 會清零整塊,並防止 count*size 乘法溢位。
全位元為零等於整數 0,且(在一般平台上)等於空指標,但 C 標準並不保證全位元為零就是浮點 0.0,也不保證對每種奇特型別都是有效的空值——實務上對整數與指標可放心依賴。