C語言malloc,calloc,realloc,free內存分配函數學習筆記

內存分配

使用內存分配函數可以對內存進行分配、釋放等操作。內存分配函數一般返回的是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_tstdlib.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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章