發(fā)布于:2021-02-09 09:40:20
0
446
0
在學(xué)習(xí)malloc和calloc之間的區(qū)別之前,讓我們先學(xué)習(xí):
什么是動態(tài)內(nèi)存分配?
動態(tài)內(nèi)存分配是在運行時分配內(nèi)存的過程。有四個庫例程,calloc()、free()、realloc()和malloc(),它們可以用來分配內(nèi)存并在程序執(zhí)行期間釋放內(nèi)存。這些例程在名為stdlib.h的頭文件中定義。
什么是malloc()?
它是一個用于動態(tài)分配內(nèi)存塊的函數(shù)。它保留指定大小的內(nèi)存空間,并返回指向內(nèi)存位置的空指針。
返回的指針通常是void類型。這意味著我們可以將malloc函數(shù)分配給任何指針。malloc的完整形式是內(nèi)存分配。
什么是calloc()?
Calloc()函數(shù)用于分配多個內(nèi)存塊。它是一種動態(tài)內(nèi)存分配函數(shù),用于將內(nèi)存分配給數(shù)組和結(jié)構(gòu)等復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。如果此函數(shù)未能按指定分配足夠的空間,它將返回null指針。calloc函數(shù)的完整形式是連續(xù)分配。
為什么要使用malloc()?
下面是使用malloc()的原因:
當(dāng)您必須在運行時分配內(nèi)存時,應(yīng)使用malloc()。
當(dāng)您必須分配在當(dāng)前內(nèi)存塊執(zhí)行之后必須存在的對象時,應(yīng)使用malloc。
如果您需要分配的內(nèi)存大于該堆棧的大小,請使用malloc()。
它將指針返回到分配空間的第一個字節(jié)。
它使開發(fā)人員可以按需要分配確切數(shù)量的內(nèi)存。
該函數(shù)從堆中分配字節(jié)的內(nèi)存塊大小。
為什么要使用calloc()?
下面是使用calloc()的原因:
當(dāng)您必須將分配的內(nèi)存設(shè)置為零時。
您可以使用calloc返回一個指針來訪問內(nèi)存堆。
需要將元素初始化為零以返回指向內(nèi)存的指針時使用。
為了防止malloc()可能發(fā)生的溢出
使用calloc()請求已知已歸零的頁面。
malloc()的語法
下面是malloc()的語法
ptr = (cast_type *) malloc (byte_size);
在上述語法中,ptr是cast類型的指針。malloc函數(shù)返回一個指向字節(jié)大小的分配內(nèi)存的指針。
ptr = (int *) malloc (50)
當(dāng)此語句成功執(zhí)行時,將保留50字節(jié)的內(nèi)存空間。保留空間的第一個字節(jié)的地址分配給int類型的指針“ptr”。
calloc()的語法
下面是malloc()的語法
ptr = (cast_type *) calloc (n, size);
上面的語法用于分配相同大小的n個內(nèi)存塊。分配內(nèi)存空間后,所有字節(jié)都初始化為零。返回當(dāng)前位于分配內(nèi)存空間的第一個字節(jié)的指針。
C中的malloc()示例
在下面的代碼中,sizeof(*ptr)用于分配一個包含15個整數(shù)的內(nèi)存塊。在printf語句中,我們找到了第6個整數(shù)的值。
#include#includeint main(){
int *ptr;
ptr = malloc(15 * sizeof(*ptr));
if (ptr != NULL) {
*(ptr + 5) = 480;
printf("Value of the 6th integer is %d",*(ptr + 5));
}
}
輸出:
第6個整數(shù)的值是480。
C中的calloc()示例
下面的C語言程序計算前十項的總和。如果指針值為null,則不會分配內(nèi)存空間。
For循環(huán)用于迭代變量“i”的值并打印總和。最后,函數(shù)free用于釋放指針。
#include#includeint main() {
int i, * ptr, sum = 0;
ptr = calloc(10, sizeof(int));
if (ptr == NULL) {
printf("Error! memory not allocated.");
exit(0);
}
printf("Building and calculating the sequence sum of the first 10 terms n");
for (i = 0; i < 10; ++i) { * (ptr + i) = i;
sum += * (ptr + i);
}
printf("Sum = %d", sum);
free(ptr);
return 0;
}
輸出:
建立并計算前10項的序列和n sum=45。
calloc()和malloc()之間的區(qū)別
以下是malloc()和calloc()之間的重要區(qū)別:
關(guān)鍵區(qū)別:
malloc()函數(shù)只返回起始地址,不將其置零另一方面,calloc()函數(shù)返回起始地址并將其置零。
在malloc函數(shù)中,參數(shù)數(shù)為2,而在calloc函數(shù)中,參數(shù)數(shù)為1。
malloc()時間效率高于calloc(),而malloc()與calloc()相比不安全。
malloc不初始化內(nèi)存,而calloc執(zhí)行內(nèi)存初始化。