天天看點

【c++】c語言中動态記憶體開辟函數malloc()、calloc()、realloc()、函數的用法解析一、malloc()函數二、calloc()函數 三、realloc()函數忘記釋放不再使用的動态開辟的空間會造成記憶體洩漏。 切記: 動态開辟的空間一定要釋放,并且正确釋放 。​​​​​​​​​​​​​

一、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。 舉個栗子:
  • #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;
    }
               
    【c++】c語言中動态記憶體開辟函數malloc()、calloc()、realloc()、函數的用法解析一、malloc()函數二、calloc()函數 三、realloc()函數忘記釋放不再使用的動态開辟的空間會造成記憶體洩漏。 切記: 動态開辟的空間一定要釋放,并且正确釋放 。​​​​​​​​​​​​​
    是以如何我們對申請的記憶體空間的内容要求初始化,那麼可以很友善的使用calloc函數來完成任務。

 三、realloc()函數

  •  realloc函數的出現讓動态記憶體管理更加靈活。
  • 有時會我們發現過去申請的空間太小了,有時候我們又會覺得申請的空間過大了,那為了合理的時候記憶體。
  • 我們一定會對記憶體的大小做靈活的調整。那 realloc 函數就可以做到對動态開辟記憶體大小的調整。 函數原型:

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

  • ptr 是要調整的記憶體位址
  •  size 調整之後新大小
  • 傳回值為調整之後的記憶體起始位置。
  • 這個函數調整原記憶體空間大小的基礎上,還會将原來記憶體中的資料移動到新的空間。
  • realloc在調整記憶體空間的是存在兩種情況: 
  1. 原有空間之後有足夠大的空間
  2. 原有空間之後沒有足夠大的空間

 當是情況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;
}
           

忘記釋放不再使用的動态開辟的空間會造成記憶體洩漏。 切記: 動态開辟的空間一定要釋放,并且正确釋放 。​​​​​​​​​​​​​

繼續閱讀