1. 程式人生 > >C語言中malloc、calloc、realloc動態記憶體分配的理解

C語言中malloc、calloc、realloc動態記憶體分配的理解

void* realloc(void* ptr, unsigned newsize);
void* malloc(unsigned size);
void* calloc(size_t numElements, size_t sizeOfElement);
都在stdlib.h函式庫內
它們的返回值都是請求系統分配的地址,如果請求失敗就返回NULL

malloc用於申請一段新的地址,引數size為需要記憶體空間的長度,如:
char* p;
p=(char*)malloc(20);

calloc與malloc相似,引數sizeOfElement為申請地址的單位元素長度,numElements為元素個數,如:
char* p;
p=(char*)calloc(20,sizeof(char));
這個例子與上一個效果相同

realloc是給一個已經分配了地址的指標重新分配空間,引數ptr為原有的空間地址,newsize是重新申請的地址長度
如:
char* p;
p=(char*)malloc(sizeof(char)*20);
p=(char*)realloc(p,sizeof(char)*40);

注意,這裡的空間長度都是以位元組為單位。

C語言的標準記憶體分配函式:malloc,calloc,realloc,free等。
malloc與calloc的區別為1塊與n塊的區別:
malloc呼叫形式為(型別*)malloc(size):在記憶體的動態儲存區中分配一塊長度為“size”位元組的連續區域,返回該區域的首地址。
calloc呼叫形式為(型別*)calloc(n,size):在記憶體的動態儲存區中分配n塊長度為“size”位元組的連續區域,返回首地址。
realloc呼叫形式為(型別*)realloc(*ptr,size):將ptr記憶體大小增大到size。
free的呼叫形式為free(void*ptr):釋放ptr所指向的一塊記憶體空間。
C++中為new/delete函式。
 
如果呼叫成功,函式malloc()和函式calloc()都將返回所分配的記憶體空間的首地址。
 
函式malloc()和函式calloc() 的主要區別是前者不能初始化所分配的記憶體空間,而後者能。如果由malloc()函式分配的記憶體空間原來沒有被使用過,則其中的每一位可能都是0;反之, 如果這部分記憶體曾經被分配過,則其中可能遺留有各種各樣的資料。也就是說,使用malloc()函式的程式開始時(記憶體空間還沒有被重新分配)能正常進行,但經過一段時間(記憶體空間還已經被重新分配)可能會出現問題。
 
函式calloc() 會將所分配的記憶體空間中的每一位都初始化為零,也就是說,如果你是為字元型別或整數型別的元素分配記憶體,那麼這些元素將保證會被初始化為0;如果你是為指標型別的元素分配記憶體,那麼這些元素通常會被初始化為空指標;如果你為實型資料分配記憶體,則這些元素會被初始化為浮點型的零。
 
malloc 向系統申請分配指定size個位元組的記憶體空間。返回型別是 void* 型別。void* 表示未確定型別的指標。C,C++規定,void* 型別可以強制轉換為任何其它型別的指標。
從函式宣告上可以看出。malloc 和 new 至少有兩個不同: new 返回指定型別的指標,並且可以自動計算所需要大小。比如:
int *p;
p = new int; //返回型別為int* 型別(整數型指標),分配大小為 sizeof(int);
或:
int* parr;
parr = new int [100]; //返回型別為 int* 型別(整數型指標),分配大小為 sizeof(int) * 100;
而 malloc則必須由我們計算要位元組數,並且在返回後強行轉換為實際型別的指標。
int* p;
p = (int *) malloc (sizeof(int));
第一、malloc 函式返回的是 void * 型別,如果你寫成:p = malloc (sizeof(int)); 則程式無法通過編譯,報錯:“不能將 void* 賦值給 int * 型別變數”。所以必須通過 (int *) 來將強制轉換。
第二、函式的實參為 sizeof(int) ,用於指明一個整型資料需要的大小。如果你寫成:
int* p = (int *) malloc (1);

程式碼也能通過編譯,但事實上只分配了1個位元組大小的記憶體空間,當你往裡頭存入一個整數,就會有3個位元組無家可歸,而直接“住進鄰居家”!造成的結果是後面的記憶體中原有資料內容全部被清空。
 malloc 也可以達到 new [] 的效果,申請出一段連續的記憶體,方法無非是指定你所需要記憶體大小。
比如想分配100個int型別的空間:
int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100個整數的記憶體空間。
另外有一點不能直接看出的區別是,malloc只管分配記憶體,並不能對所得的記憶體進行初始化,所以得到的一片新記憶體中,其值將是隨機的。

相關推薦

C言中malloccallocrealloc動態記憶體分配理解

void* realloc(void* ptr, unsigned newsize); void* malloc(unsigned size); void* calloc(size_t numElements, size_t sizeOfElement); 都在stdlib.h函式庫內 它們的返回值都是請求系

C言中malloc函數的理解

萬能 一個 函數 語言 就是 有一個 類型轉換 har 扯淡 在C語言中malloc函數主要是用在堆內存的申請上,使用malloc函數時,函數會返回一個void *類型的值,這個值就是你申請的堆內存的首地址;為什麽返回的地址是一個void *類型的地址呢?首先我們要先弄明白

C言中 malloc 和 free

from:http://blog.sina.com.cn/s/blog_af1a77fa0102xceb.html 一、malloc()和free()的基本概念以及基本用法: 1、函式原型及說明: void *malloc(long NumBytes):該函式分配了NumBytes個位元

關於c言中malloc和remalloc函式的分析

首先申明,這是本人第一次寫部落格,其目的僅僅是為了加強自己對知識點的掌握,為到達在本子上記筆記的效果 進入正題。對於malloc,它的作用就是為了動態分配空間,像c++中的new一樣。這裡就不說他們兩的區別了。malloc函式有這樣幾個特點。 1.分配的空間地址是連續的,

轉 【C語言】malloccallocrealloc的區別

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

C言中malloc/free和C++中new/delete的區別

1. malloc()函式1.1 malloc的全稱是memory allocation,中文叫動態記憶體分配。原型:extern void *malloc(unsigned int num_bytes); 說明:分配長度為num_bytes位元組的記憶體塊。如果分配成功則返回指向被分配記憶體的指標,分配失敗

C/C++開發】malloccallocrealloc的區別和注意事項

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

c語言基礎(六)靜態和動態記憶體分配

1.靜態記憶體是程式編譯執行後系統自動分配,由系統自動釋放,靜態記憶體是棧分配的 第一次執行完畢後i就被釋放了,所以後面輸出的為垃圾值 2.動態記憶體分配是開發者手動分配的,是堆分配的 malloc(int)函式申請記憶體空間 free()回收 realloc()重新分

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

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

C/C++中的malloccallocrealloc

1. malloc 原型:extern void *malloc(unsigned int num_bytes); 標頭檔案:Visual C++6.0中可以用malloc.h或者stdlib.h 功能:分配長度為num_bytes位元組的記憶體塊 返回值:如果分配成功則返回指向被分配記憶體的指標(此儲存區

C語言記憶體分配malloccallocrealloc

大家都知道程式在記憶體中的佈局分為:棧區、堆、靜態變數區、常量區等幾個部分。其中堆上的空間分配是由程式設計師自己來管理的,包括空間的申請和釋放。 我們這裡就說一下C標準庫中提供的幾個在堆上操作空間的函式: 1、void*malloc(unsigned size); 2

C語言:malloccallocrealloc的區別

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

c語言記憶體函式malloccallocreallocalloca比較

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

malloccallocrealloc和alloca各種的區別

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

【轉載】在C言中,doublelongunsignedintchar類型數據所占字節數

src 有關 指針變量 none nbsp ide iso isp cli 和機器字長及編譯器有關系: 所以,int,long int,short int的寬度都可能隨編譯器而異。但有幾條鐵定的原則(ANSI/ISO制訂的): 1 sizeof(short int)&

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

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

C言中的I/O函數scanfgetcharprintf和putchar說明

重要 col ace 驗證 enter inpu 個數 是否 交互 scanf()、printf()、getchar()和putchar()這四個函數能夠讓用戶和程序交流,所以被稱為輸入/輸出函數,或簡稱為I/O函數。 這裏先結合緩沖輸入來講講scanf()和getchar

malloccallocrealloc的區別】

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

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

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

C言中scanfgetsfgets的區別

1.scanf會讀取標準輸入緩衝區中的輸入行內容直到遇到回車或空白(回車、tab、空格)以換行為例,會把換行符之前的資料全部讀入到scanf指定的變數中,回車(\n)依然儲存 在緩衝區中,等待下次讀取標準輸入緩衝區 遇到上面這種情況一般需要加入一下程式碼來清空快取區的行