程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話編程平分配內存空間的相干函數

C說話編程平分配內存空間的相干函數

編輯:關於C++

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

下面的法式會將你輸出的數字存儲起來,然後輸入。由於在法式運轉時依據你的須要來靜態分派內存,所以每次運轉法式你可以輸出分歧數量的數字。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved