動態內存函數的介紹

*Yiiiiiiiiiiiiii 2022-01-08 03:19:02 阅读数:658

2.1 malloc和free


C語言提供了一個動態內存開辟的函數:

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>
int main()
{
//代碼1
int num = 0;
scanf("%d", &num);
int arr[num] = {0};
//代碼2
int* ptr = NULL;
ptr = (int*)malloc(num*sizeof(int));
if(NULL != ptr)//判斷ptr指針是否為空
{
int i = 0;
for(i=0; i<num; i++)
{
*(ptr+i) = 0;
}
}
free(ptr);//釋放ptr所指向的動態內存
ptr = NULL;//是否有必要?
return 0;
}

 

2.2 calloc
C語言還提供了一個函數叫 calloc , calloc 函數也用來動態內存分配。原型如下:

void* calloc (size_t num, size_t size);

  • 函數的功能是為 num 個大小為 size 的元素開辟一塊空間,並且把空間的每個字節初始化為0。
  • 與函數 malloc 的區別只在於 calloc 會在返回地址之前把申請的空間的每個字節初始化為全0。 

舉個例子:

#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p = (int*)calloc(10, sizeof(int));
if(NULL != p)
{
//使用空間
}
free(p);
p = NULL;
return 0;
}

所以如何我們對申請的內存空間的內容要求初始化,那麼可以很方便的使用calloc函數來完成任務。


2.3 realloc
realloc函數的出現讓動態內存管理更加靈活。

  • 有時會我們發現過去申請的空間太小了,有時候我們又會覺得申請的空間過大了,那為了合理的時
  • 候內存,我們一定會對內存的大小做靈活的調整。那 realloc 函數就可以做到對動態開辟內存大小的調整。

函數原型如下:

void* realloc (void* ptr, size_t size);

  • ptr 是要調整的內存地址
  • size 調整之後新大小
  • 返回值為調整之後的內存起始比特置。
  • 這個函數調整原內存空間大小的基礎上,還會將原來內存中的數據移動到 新 的空間。

realloc在調整內存空間的是存在兩種情况:
情况1:原有空間之後有足够大的空間

情况2:原有空間之後沒有足够大的空間

情况1
當是情况1 的時候,要擴展內存就直接原有內存之後直接追加空間,原來空間的數據不發生變化。
情况2
當是情况2 的時候,原有空間之後沒有足够多的空間時,擴展的方法是:在堆空間上另找一個合適大小的連續空間來使用。這樣函數返回的是一個新的內存地址。
由於上述的兩種情况,realloc函數的使用就要注意一些。

版权声明:本文为[*Yiiiiiiiiiiiiii]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201080319018271.html