一、malloc()函數
void * malloc(size_t size)
這個函數向記憶體申請一塊連續可用的空間,并傳回指向這塊空間的指針。
- 如果開辟成功,則傳回一個指向開辟好空間的指針。
- 如果開辟失敗,則傳回一個NULL指針,是以malloc的傳回值一定要做檢查。
- 傳回值的類型是 void* ,是以malloc函數并不知道開辟空間的類型,具體在使用的時候使用者自己來決定。
- 如果參數 size 為0,malloc的行為是标準是未定義的,取決于編譯器。
C語言提供了另外一個函數free,專門是用來做動态記憶體的釋放和回收的,函數原型如下:
void free (void* ptr);
- free函數用來釋放動态開辟的記憶體。
- 如果參數 ptr 指向的空間不是動态開辟的,那free函數的行為是未定義的。
- 如果參數 ptr 是NULL指針,則函數什麼事都不做
malloc和free都聲明在 stdlib.h 頭檔案中。 舉個栗子:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<memory.h>
#define NUM 10
int main1()
{
/*int num = 0;
scanf("%d", &num);
int arr[num] = { 0 };*/
int *p = NULL;
p = (int*)malloc(NUM * sizeof(int));
if (NULL != p)
{
int i = 0;
for (i = 0; i < NUM; ++i)
{
*(p + i) = i;
}
}
for (int i = 0; i < NUM; ++i)
{
printf("%d ", *(p + i));
}
puts("\n");
free(p);
p = NULL;
system("pause");
return 0;
}
二、calloc()函數
C語言還提供了一個函數叫 calloc , calloc 函數也用來動态記憶體配置設定。原型如下:
void * calloc(size_t num,size_t size);
- 函數的功能是為 num 個大小為 size 的元素開辟一塊空間,并且把空間的每個位元組初始化為全0。
- 與函數 malloc 的差別隻在于 calloc 會在傳回位址之前把申請的空間的每個位元組初始化為全0。 舉個栗子:
-
是以如何我們對申請的記憶體空間的内容要求初始化,那麼可以很友善的使用calloc函數來完成任務。#include<stdio.h> #include<stdlib.h> #include<assert.h> #include<memory.h> #define NUM 10 int main2() { int *p = NULL; p = (int *)calloc(NUM, sizeof(int)); if (NULL != p) { int i = 0; for (i = 0; i < NUM; ++i) { *(p + i) = i; } } for (int i = 0; i < NUM; ++i) { printf("%d ", *(p + i)); } puts("\n"); free(p); p = NULL; system("pause"); return 0; }
三、realloc()函數
- realloc函數的出現讓動态記憶體管理更加靈活。
- 有時會我們發現過去申請的空間太小了,有時候我們又會覺得申請的空間過大了,那為了合理的時候記憶體。
- 我們一定會對記憶體的大小做靈活的調整。那 realloc 函數就可以做到對動态開辟記憶體大小的調整。 函數原型:
void * realloc(void * ptr,size_t size);
- ptr 是要調整的記憶體位址
- size 調整之後新大小
- 傳回值為調整之後的記憶體起始位置。
- 這個函數調整原記憶體空間大小的基礎上,還會将原來記憶體中的資料移動到新的空間。
- realloc在調整記憶體空間的是存在兩種情況:
- 原有空間之後有足夠大的空間
- 原有空間之後沒有足夠大的空間
當是情況1 的時候,要擴充記憶體就直接原有記憶體之後直接追加空間,原來空間的資料不發生變化。 情況2 當
是情況2 的時候,原有空間之後沒有足夠多的空間時,擴充的方法是:在堆空間上另找一個合适大小的連續空間來
使用。這樣函數傳回的是一個新的記憶體位址。 由于上述的兩種情況,realloc函數的使用就要注意一些。 舉個栗
子:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<memory.h>
#define NUM 10
int main3()
{
int *ptr =(int*) malloc(100);
if (ptr != NULL)
{
//業務處理
}
else
{
exit(EXIT_FAILURE);
}
//擴充容量
//代碼1
//ptr = (int *)realloc(ptr, 1000);//這樣可以嗎?(如果申請失敗會如何?)
//代碼2
int*p = NULL;
p = (int *)realloc(ptr, 1000);
if (p != NULL)
{
ptr = p;
}
//業務處理
free(ptr);
system("pause");
return 0;
}