1. 程式人生 > >動態記憶體分配(malloc、realloc、calloc函式)

動態記憶體分配(malloc、realloc、calloc函式)

一、關於動態記憶體分配的定義(用時分配,不用釋放

所謂動態記憶體分配,就是指在程式執行的過程中動態地分配或者回收儲存空間的分配記憶體的方法。動態記憶體分配不象陣列等靜態記憶體分配方法那樣需要預先分配儲存空間,而是由系統根據程式的需要即時分配,且分配的大小就是程式要求的大小。

二、相關函式

1、malloc()函式

函式原型:void *malloc(unsigned int num_bytes);
引數:num_bytes 是無符號整型,用於表示分配的位元組數。
返回值:如果分配成功則返回指向被分配記憶體的指標(此儲存區中的初始值不確定),否則返回空指標NULL。void* 表示未確定型別的指標,void *可以指向任何型別的資料,更明確的說是指申請記憶體空間時還不知道使用者是用這段空間來儲存什麼型別的資料(比如是char還是int或者...)
功能:分配長度為num_bytes位元組的記憶體塊
注意:當記憶體不再使用時,應使用free()函式將記憶體塊釋放。函式返回的指標一定要適當對齊,使其可以用於任何資料物件。關於該函式的原型,在以前malloc返回的是char型指標,新的ANSIC標準規定,該函式返回為void型指標,因此必要時要進行型別轉換。
例項:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
int main()
{
	char *p = NULL;
	p =(char*) malloc(10);
	
	if (p)
		printf("開闢成功!\n");
	else
		printf("開闢失敗!\n");
	strcpy(p, "hello!");
	printf("%s\n", p);
	free(p);
	p = NULL;
	system("pause");
	return 0;
}


2、realloc()函式
原型:extern void *realloc(void *mem_address, unsigned int newsize);

語法:指標名=(資料型別*)realloc(要改變記憶體大小的指標名,新的大小)。

標頭檔案:#include <stdlib.h> 有些編譯器需要#include <malloc.h>

功能:先判斷當前的指標是否有足夠的連續空間,如果有,擴大當前指標指向的地址,如果空間不夠,先按照newsize指定的大小分配空間,將原有資料從頭到尾拷貝到新分配的記憶體區域,而後釋放原來指標所指記憶體區域(注意:原來指標是自動釋放,不需要使用free),同時返回新分配的記憶體區域的首地址。即重新分配儲存器塊的地址。

返回值:如果重新分配成功則返回指向被分配記憶體的指標,否則返回空指標NULL。

注意:當記憶體不再使用時,應使用free()函式將記憶體塊釋放。

例項:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
int main()
{
	char *p = NULL;
	p =(char*) malloc(10);
	
	if (p)
		printf("開闢成功!\n");
	else
		printf("開闢失敗!\n");
	strcpy(p, "hello!");
	printf("%s\n", p);
	char*new_p = (char*)realloc(p, 20 * sizeof(char));
	if (new_p == NULL)
	{
		printf("擴大失敗!");
	}
	else
		printf("擴大成功!\n");
	strcpy(new_p, "nice to meet you!");
	printf("%s\n", p);
	p = new_p;
	free(p);
	p = NULL;
	system("pause");
	return 0;
}

3、calloc()函式

函式原型:void *calloc(size_t n, size_t size);功 能:在記憶體的動態儲存區中分配n個長度為size的連續空間,函式返回一個指向分配起始地址的指標;如果分配不成功,返回NULL。與malloc函式的區別:動態分配完記憶體後,自動初始化該記憶體空間為零,而malloc不初始化,裡邊資料是隨機的。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
int main()
{
	int *pn = NULL;
	int i = 0;
	pn = (int*)calloc(10, sizeof(int));
	for (i = 0; i < 10; i++)
	{
		printf("%d ", pn[i]);
	}
	free(pn);
	pn = NULL;
	system("pause");
	return 0;
}