內存分配
使用內存分配函數可以對內存進行分配、釋放等操作。內存分配函數一般返回的是void類型的指針,傳統上曾使用返回char類型的指針,因爲char類型只佔據1字節。而最新ANSI規定返回void類型指針,這樣可以指向任何類型,通常使用強制轉化運算符進行返回值的強制轉化,其實不使用也可以,因爲存在隱式轉換。
一、malloc()
1、原型:void *malloc(size_t size)
2、頭文件:stdlib.h
3、功能:在內存中分配一塊大小爲size字節的內存區域
4、返回值:返回指向第一字節的地址,由於內存不足而分配失敗,將返回NULL指針
5、參數解讀:
i. 函數參數通常使用sizeof關鍵字來指定空間大小,以保證可移植性。
ii. size_t在stdlib.h中被定義爲unsigned int型
6、補充:
i. 全稱是memory allocation,中文叫動態內存分配。
7、舉例:
例1:
#include <stdlib.h>
#include <stdio.h>
int main()
{
<span style="white-space:pre"> </span>int num,i;
<span style="white-space:pre"> </span>int *p;
<span style="white-space:pre"> </span>puts("需要輸入多少個整形數據");
<span style="white-space:pre"> </span>scanf("%d",&num);
<span style="white-space:pre"> </span>p=(int *)malloc(num*sizeof(int));
<span style="white-space:pre"> </span>if(p==NULL)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>puts("分配內存失敗!");
<span style="white-space:pre"> </span>exit(EXIT_FAILURE);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>printf("我們已經爲你分配了%d個整型數據存儲空間\n",num);
<span style="white-space:pre"> </span>puts("請輸入數據:");
<span style="white-space:pre"> </span>for(i=0;i<num;i++)
<span style="white-space:pre"> </span>scanf("%d",p+i);
<span style="white-space:pre"> </span>puts("數據如下:");
<span style="white-space:pre"> </span>for(i=0;i<num;i++)
<span style="white-space:pre"> </span>printf("%d",*(p+i));
<span style="white-space:pre"> </span>free(p);
<span style="white-space:pre"> </span>return 0;
}
二、free()
1、原型:void free(*ptr)
2、頭文件:stdlib.h
3、功能:釋放被分配的內存
4、返回值:void
5、參數解讀:參數爲指向被分配過內存的指針,釋放後指針成爲“野指針”
6、補充:在確定不再使用被分配的內存區域後一定要釋放內存,否則將造成佔據的內存越來越來大,尤其是在遞歸函數時,最終造成內存溢出。程序關閉後,操作系統將自動釋放內存。
7、例子:見例1
三、calloc()
1、原型:void *calloc(size_t count,size_t size)
2、頭文件:stdlib.h
3、功能:分配內存
4、返回值:通用指針類型,如果不成功將返回NULL
5、參數解讀:第一個參數指定size大小的個數,第二個爲分配內存的大小
6、補充:此函數與malloc區別是,它初始化所有空間爲0,這會降低效率,因爲有些 時候我們並不需要這樣的初始化
7、例子:
例2:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *str;
int n;
puts("請輸入需要的內存空間大小");
scanf("%d",&n);
getchar();
str=(char *)calloc(n,sizeof(char));
puts("請輸入字符串");
gets(str);
puts("你輸入的字符串是:");
puts(str);
free(str);
return 0;
}
四、realloc()
1、原型:void *realloc(void *p,size_t size)
2、頭文件:stdlib.h
3、功能:重新分配內存大小
4、返回值:指向新內存區域指針,失敗爲NULL
5、參數解讀:第一個參數爲原指針,第二個參數爲重新分配大小的字節值
6、補充:
i. 該函數首先會判斷size大小與原區域大小,如果新分配的內存區域比舊內存區域小,則會丟棄超出的內存部分。之後如果在原區域後無法再分配,則會另外尋找一塊足夠大的內存區域,並將原區域的內容複製到新內存中。
ii. 如果第一個參數爲NULL,效果同malloc,如果第二個參數爲0,效果同free