C說話編程平分配內存空間的相干函數。本站提示廣大學習愛好者:(C說話編程平分配內存空間的相干函數)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話編程平分配內存空間的相干函數正文
C說話malloc()函數:靜態分派內存空間
頭文件:
#include <stdlib.h>
malloc() 函數用來靜態地分派內存空間(假如你不懂得靜態內存分派,請檢查:C說話靜態內存分派及變量存儲種別),其原型為:
void* malloc (size_t size);
【參數解釋】size 為須要分派的內存空間的年夜小,以字節(Byte)計。
【函數解釋】malloc() 在堆辨別配一塊指定年夜小的內存空間,用來寄存數據。這塊內存空間在函數履行完成後不會被初始化,它們的值是未知的。假如願望在分派內存的同時停止初始化,請應用 calloc() 函數。
【前往值】分派勝利前往指向該內存的地址,掉敗則前往 NULL。
因為請求內存空間時能夠有也能夠沒有,所以須要自行斷定能否請求勝利,再停止後續操作。
假如 size 的值為 0,那末前往值會因尺度庫完成的分歧而分歧,能夠是 NULL,也能夠不是,但前往的指針不該該再次被援用。
留意:函數的前往值類型是 void *,void 其實不是說沒有前往值或許前往空指針,而是前往的指針類型未知。所以在應用 malloc() 時平日須要停止強迫類型轉換,將 void 指針轉換成我們願望的類型,例如:
char *ptr = (char *)malloc(10); // 分派10個字節的內存空間,用來寄存字符
靜態內存分派舉例:
#include <stdio.h> /* printf, scanf, NULL */ #include <stdlib.h> /* malloc, free, rand, system */ int main () { int i,n; char * buffer; printf ("輸出字符串的長度:"); scanf ("%d", &i); buffer = (char*)malloc(i+1); // 字符串最初包括 \0 if(buffer==NULL) exit(1); // 斷定能否分派勝利 // 隨機生成字符串 for(n=0; n<i; n++) buffer[n] = rand()%26+'a'; buffer[i]='\0'; printf ("隨機生成的字符串為:%s\n",buffer); free(buffer); // 釋放內存空間 system("pause"); return 0; }
運轉成果:
輸出字符串的長度:20 隨機生成的字符串為:phqghumeaylnlfdxfirc
C說話calloc()函數:分派內存空間並初始化
頭文件:
#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
下面的法式會將你輸出的數字存儲起來,然後輸入。由於在法式運轉時依據你的須要來靜態分派內存,所以每次運轉法式你可以輸出分歧數量的數字。