malloc 和calloc 有啥區別

2021-08-30 09:48:54 字數 2532 閱讀 2127

函式malloc()和calloc()都可以用來動態分配記憶體空間,但兩者稍有區別。

1,malloc()函式有乙個引數,即要分配的記憶體空間的大小.

void *malloc(size_t size);

2,calloc()函式有兩個引數,分別為元素的數目和每個元素的大小,這兩個引數的乘積就是要分配的記憶體空間的大小.

void *calloc(size_t numelements,size_t sizeofelement);

3,如果呼叫成功,函式malloc()和函式calloc()都將返回所分配的記憶體空間的首位址。

4,函式malloc()和函式calloc()的主要區別是:malloc()不能初始化所分配的記憶體空間,而calloc()能。

如果由malloc()函式分配的記憶體空間原來沒有被使用過,則其中的每一位可能都是0;反之,如果這部分記憶體曾經被分配過,則其中可能遺留有各種各樣的資料。也就是說,使用malloc()函式的程式開始時(記憶體空間還沒有被重新分配)能正常進行,但經過一段時間(記憶體空間還已經被重新分配)可能會出現問題。

函式calloc()會將所分配的記憶體空間中的每一位都初始化為零,也就是說,如果你是為字元型別或整數型別的元素分配記憶體,那麼這些元素將保證會被初始化為0;如果你是為指標型別的元素分配記憶體,那麼這些元素通常會被初始化為空指標;如果你為實型資料分配記憶體,則這些元會被初始化為浮點型的零。

5,malloc和new的區別:

函式宣告(函式原型):void *malloc(int size)

說明:malloc 向系統申請分配指定size個位元組的記憶體空間。返回型別是 void* 型別。

void* 表示未確定型別的指標。c,c++規定,void* 型別可以強制轉換為任何其它型別的指標。

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));

6,realloc

原型:extern void *realloc(void *mem_address, unsigned int newsize);

用法:#include 有些編譯器需要#include

功能:改變mem_address所指記憶體區域的大小為newsize長度。

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

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

注意:這裡原始記憶體中的資料還是保持不變的。

7,memcpy

原型:extern void *memcpy(void *dest, void *src, unsigned int count);

用法:#include

功能:由src所指記憶體區域複製count個位元組到dest所指記憶體區域。

說明:[b]src和dest所指記憶體區域不能重疊[/b],函式返回指向dest的指標。

8,memmove

原型:extern void *memmove(void *dest, const void *src, unsigned int count);

用法:#include

功能:由src所指記憶體區域複製count個位元組到dest所指記憶體區域。

說明:[b]src和dest所指記憶體區域可以重疊[/b],但複製後src內容會被更改。函式返回指向 dest的指標。

9,memcmp

原型:extern int memcmp(void *buf1, void *buf2, unsigned int count);

用法:#include

功能:比較記憶體區域buf1和buf2的前count個位元組。

說明:當buf1buf2時,返回值》0

10,strncmp

函式名: strncmp

功 能: 串比較

用 法: int strncmp(char *str1, char *str2, int maxlen);

說明:比較字串str1和str2的大小,如果str1小於str2,返回值就<0,反之如果str1大於str2,返回值就》0,如果str1等於str2,返回值就=0,maxlen指的是str1與str2的比較的字元數。此函式功能即比較字串str1和str2的前maxlen個字元。

11,strncpy

char * strncpy(char *s1,char *s2,size_t n);

將字串s2中最多n個字元複製到字元陣列s1中,返回指向s1的指標。

注意:如果源串長度大於n,則strncpy不複製最後的'\0'結束符,所以是不安全的,複製完後需要手動新增字串的結束符才行。如果拷貝到'\0'就結束複製。

calloc 函式和malloc 函式

calloc 配置記憶體空間 malloc,free,realloc,brk include void calloc size t nmemb,size t size calloc 用來配置nmemb個相鄰的記憶體單位,每一單位的大小為size,並返回指向第乙個元素的指標。這和使用下列的方式效果相同...

malloc 和 calloc 的區別

void calloc size t num elements,size t element size void malloc size t size calloc和malloc都用於分配記憶體。1.malloc函式 malloc函式可以從堆上獲得指定位元組的記憶體空間,其函式宣告如下 void m...

malloc和calloc的區別

函式 malloc 和calloc 都可以用來動態分配記憶體空間 但兩者稍有區別。malloc 函式有乙個引數 即要分配的記憶體空間的大小 void malloc size t size calloc 函式有兩個引數 分別為元素的數目和每個元素的大小 這兩個引數的乘積就是要分配的記憶體空間的大小。v...