1. 程式人生 > >realloc、malloc、以及calloc函式的區別

realloc、malloc、以及calloc函式的區別

對於這個說爛的問題 ,做一點感悟筆記。三者都是分配記憶體,都是stdlib.h庫裡的函式,但是也存在一些細微的差異。

首先,對於malloc函式。其原型void *malloc(unsigned int num_bytes)

num_byte為要申請的空間大小,需要我們手動的去計算,如int *p = (int *)malloc(20*sizeof(int)),如果編譯器預設int4位元組儲存的話,那麼計算結果是80Byte一次申請一

80Byte的連續空間,並將空間基地址強制轉換為int型別,賦值給指標p,此時申請的記憶體值是不確定的。

而對於calloc函式,其原型void *calloc(size_t n, size_t size);

從直觀的看,其比malloc函式多一個引數,並不需要人為的計算空間的大小,比如如果他要申請20個int型別空間,會int *p = (int *)calloc(20, sizeof(int)),這樣就省去了人為空

間計算的麻煩。但這並不是他們之間最重要的區別,malloc申請後空間的值是隨機的,並沒有進行初始化,而calloc卻在申請後,對空間逐一進行初始化,並設定值為0;

如下

	int *p = (int *)malloc(20*sizeof(int));
	int *pp = (int *)calloc(20, sizeof(int));
	int i;
	
	printf("malloc申請的空間值:\n\n");
	for ( i=0 ; i < 20; i++)
	{
		printf("%d ", *p++);
	}
	printf("\n\n");
	printf("calloc申請的空間的值:\n\n");
	for ( i=0 ; i < 20; i++)
	{
		printf("%d ", *pp++);
	}
	printf("\n");


結果為

很多人會疑問:既然calloc不需要計算空間並且可以直接初始化記憶體避免錯誤,那為什麼不直接使用calloc函式,那要malloc要什麼用呢?

實際上,任何事物都有兩面性,有好的一面,必然存在不好的地方。這就是效率。calloc函式由於給每一個空間都要初始化值,那必然效率較malloc要低,並且現實世界,很多情況的空間申請是不需要初始值的,這也就是為什麼許多初學者更多的接觸malloc函式的原因。

說完了malloccalloc,接下來談realloc函式。

realloc函式和上面兩個有本質的區別,

其原型void realloc(void *ptr, size_t new_Size) 

用於對動態記憶體進行擴容(及已申請的動態空間不夠使用,需要進行空間擴容操作)

ptr為指向原來空間基址的指標, new_size為接下來需要擴充容量的大小

int main(void)
{
	const int size = 2000;
	int *p = (int *)malloc(20*sizeof(int));
	int *pp = (int *)realloc(p, size*sizeof(int));
	
	printf("原來的p_Address:%x   擴容後的pp_Address:%x \n\n", p, pp);
	
	return 0;
}


結果為:

可從圖看出,擴容後地址和原先地址是不一樣的,但是這僅僅取決於擴容的記憶體大小。

實際上:

        如果size較小,原來申請的動態記憶體後面還有空餘記憶體,系統將直接在原記憶體空間後面擴容,並返回原動態空間基地址;

        如果size較大,原來申請的空間後面沒有足夠大的空間擴容,系統將重新申請一塊(20+size)*sizeof(int)的記憶體,並把原來空間的內容拷貝過去,原來空間free;

        如果size非常大,系統記憶體申請失敗,返回NULL,原來的記憶體不會釋放。

注意:如果擴容後的記憶體空間較原空間小,將會出現資料丟失,如果直接realloc(p, 0);相當於free(p)

完結。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

相關推薦

reallocmalloc以及calloc函式區別

對於這個說爛的問題 ,做一點感悟筆記。三者都是分配記憶體,都是stdlib.h庫裡的函式,但是也存在一些細微的差異。 首先,對於malloc函式。其原型void *malloc(unsigned int num_bytes) num_byte為要申請的空間大小,需要我們

alloc()malloc()calloc()realloc()區別及用法

CA 這一 首地址 動態分配內存 調用函數 空指針 size 指針類型 空間 C語言跟內存申請相關的函數主要有 alloca,calloc,malloc,free,realloc,sbrk等. 函數malloc()和calloc()都可以用來動態分配內存空間,

realloc函式malloc函式calloc函式區別

一, malloc   void *malloc(unsigned int num_byte) 1,num_bytes為需要申請的記憶體大小,需要人為的去計算,申請的型別徐手動強轉為對應指標的型別 2,申請的值是不確定的 二 calloc void*calloc(

淺談HTTP中GETPOST用法以及它們的區別

HTTP定義了與伺服器互動的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符。我們可以這樣認為: 一個URL地址,它用於描述一個網路上的資源,而HTTP中的GET,POST,PUT,DELETE就對應著對這個資源

iOS的記憶體管理和引用計數規則Block的用法以及三種形式(stackmallocglobal)

### 學習內容 1. iOS的記憶體管理和引用計數規則 - 記憶體管理的思考方式 - 自己生成的物件自己持有 - 非自己生成的物件自己也能持有 - 自己持有的物件不需要時釋放 - 非自己持有的物件不能釋放 - ARC有效時,id型別和物件型別必須加

CString/string /Char轉化Vector分割NewMallocMemsetMemcpyStrcpystatic

#include "stdafx.h" #include <string> // #include <stdlib.h> #include <stdio.h> #include <iostream> using namespa

C語言動態記憶體管理:mallocrealloccalloc以及free函式

我們已經掌握的記憶體開闢方式有: int val = 20;//在棧空間上開闢四個位元組 char arr[10] = {0};//在棧空間上開闢10個位元組的連續空間 但是這種開闢空間的方式有兩個特點: 1. 空間開闢的大小是固定的。

malloccallocrealloc和alloca各種的區別

calloc 一次 單元 不支持 new span 初始化 har 堆棧 需要先包含頭文件 #include"malloc.h" malloc是標準的在堆中開辟新的空間 比如 char *pt=(char *)malloc(10*sizeof(char)); 需要free(

malloccallocrealloc區別

(1)C語言跟記憶體分配方式 <1>從靜態儲存區域分配. 記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在.例如全域性變數、static變數. <2>在棧上建立 在執行函式時,函式內區域性變數的儲存單元都可以在棧上

【程式語言學習 1】malloccallocrealloc區別

(1)C語言跟記憶體分配方式 <1>從靜態儲存區域分配.        記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在.例如全域性變數、static變數. <2>在棧上建立  

malloccallocrealloc區別

(2)C語言跟記憶體申請相關的函式主要有 alloca、calloc、malloc、free、realloc等.    <1>alloca是向棧申請記憶體,因此無需釋放.    <2>malloc分配的記憶體是位於堆中的,並且沒有初始化記憶體的內容,因此基本上malloc之後,呼叫函式

malloccallocrealloc之間的區別

一,malloc、calloc、realloc 1,malloc 函式原型: void* malloc(unsigned size);函式功能: 在堆記憶體中分配一塊長度為size位元組的連續區域,引

動態記憶體分配(mallocrealloccalloc函式

一、關於動態記憶體分配的定義(用時分配,不用釋放)所謂動態記憶體分配,就是指在程式執行的過程中動態地分配或者回收儲存空間的分配記憶體的方法。動態記憶體分配不象陣列等靜態記憶體分配方法那樣需要預先分配儲存

C語言:malloccallocrealloc區別

很多小夥伴都不知道malloc、calloc、realloc的區別,所以這次小編蒐集點乾貨給大家分享。 C語言跟記憶體分配方式 <1>從靜態儲存區域分配. 記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在.例如全域性變數、static變數

【12】動態記憶體之malloccallocreallocfree函式

建立動態記憶體:int *p = (int *) malloc(n*sizeof(int)); #include<stdio.h> #include<stdlib.h> #include<assert.h> // #include

malloccallocrealloc的使用和區別

一、malloc 1.函式原型 void *malloc(size_t size);  2.函式功能 malloc()在記憶體的動態儲存區中分配一塊長度為size位元組的連續區域。引數size為需要的

c語言記憶體函式malloccallocreallocalloca比較

功能上的區別: (1)malloc  申請指定位元組數的記憶體。申請到的記憶體中的初始值不確定。 (2)calloc 為指定長度的物件,分配能容納其指定個數的記憶體。申請到的記憶體的每一位(bit)都

mallocfreerealloccalloc函數

C語言malloc函數 原型:extern void* malloc(unsigned int size); 功能:動態分配內存; 註意:size僅僅為申請內存字節大小,與申請內存塊中存儲的數據類型無關,故編程時需要通過以下方式給出:"長度 * sizeof(數據類型)"; 示例

C語言動態記憶體管理malloccallocreallocfree的用法和注意事項

此文是參考http://www.cplusplus.com/reference/cstdlib/裡的動態記憶體管理部分所寫,如發現有問題和不足之處,請參看原文,最好能幫忙指出,謝謝。 1.void* malloc (size_t size); malloc:分配一塊size

動態記憶體分配(mallocfreecallocrealloc

1. void*   malloc(size_t size);     //size_t   size表示的是記憶體的總大小 a、malloc所分配的是一塊連續的記憶體,以位元組為單位,並且不帶任何資訊 b、malloc實際分配的記憶體可能比請求的稍微多一點(什麼原因呢?思