http://c.biancheng.net/cpp/html/134.html
頭文件:#include <stdlib.h>
calloc() 函數用來動態地分配內存空間并初始化為 0,其原型為:
? ? void* calloc (size_t num, size_t size);
calloc() 在內存中動態地分配 num 個長度為 size 的連續空間,并將每一個字節都初始化為 0。所以它的結果是分配了 num*size 個字節長度的內存空間,并且每個字節的值都是0。
【返回值】分配成功返回指向該內存的地址,失敗則返回 NULL。
如果 size 的值為 0,那么返回值會因標準庫實現的不同而不同,可能是 NULL,也可能不是,但返回的指針不應該再次被引用。
注意:函數的返回值類型是 void *,void 并不是說沒有返回值或者返回空指針,而是返回的指針類型未知。所以在使用 calloc() 時通常需要進行強制類型轉換,將 void 指針轉換成我們希望的類型,例如:
- char *ptr = (char *)calloc(10, 10); // 分配100個字節的內存空間
calloc() 與? malloc() ?的一個重要區別是:calloc() 在動態分配完內存后,自動初始化該內存空間為零,而 malloc() 不初始化,里邊數據是未知的垃圾數據。下面的兩種寫法是等價的:
- // calloc() 分配內存空間并初始化
- char *str1 = (char *)calloc(10, 2);
- // malloc() 分配內存空間并用 memset() 初始化
- char *str2 = (char *)malloc(20);
- memset(str2, 0, 20);
代碼示例:
- #include <stdio.h>
- #include <stdlib.h>
- int main ()
- {
- int i,n;
- int * pData;
- printf ("要輸入的數字的數目:");
- scanf ("%d",&i);
- pData = (int*) calloc (i,sizeof(int));
- if (pData==NULL) exit (1);
- for (n=0;n<i;n++)
- {
- printf ("請輸入數字 #%d:",n+1);
- scanf ("%d",&pData[n]);
- }
- printf ("你輸入的數字為:");
- for (n=0;n<i;n++) printf ("%d ",pData[n]);
- free (pData);
- system("pause");
- return 0;
- }
要輸入的數字的數目:4
請輸入數字 #1:126
請輸入數字 #2:343
請輸入數字 #3:45
請輸入數字 #4:234
你輸入的數字為:126 343 45 234
上面的程序會將你輸入的數字存儲起來,然后輸出。因為在程序運行時根據你的需要來動態分配內存,所以每次運行程序你可以輸入不同數目的數字。