发布于:2021-02-09 09:40:20
0
417
0
在学习malloc和calloc之间的区别之前,让我们先学习:
什么是动态内存分配?
动态内存分配是在运行时分配内存的过程。有四个库例程,calloc()、free()、realloc()和malloc(),它们可以用来分配内存并在程序执行期间释放内存。这些例程在名为stdlib.h的头文件中定义。
什么是malloc()?
它是一个用于动态分配内存块的函数。它保留指定大小的内存空间,并返回指向内存位置的空指针。
返回的指针通常是void类型。这意味着我们可以将malloc函数分配给任何指针。malloc的完整形式是内存分配。
什么是calloc()?
Calloc()函数用于分配多个内存块。它是一种动态内存分配函数,用于将内存分配给数组和结构等复杂的数据结构。如果此函数未能按指定分配足够的空间,它将返回null指针。calloc函数的完整形式是连续分配。
为什么要使用malloc()?
下面是使用malloc()的原因:
当您必须在运行时分配内存时,应使用malloc()。
当您必须分配在当前内存块执行之后必须存在的对象时,应使用malloc。
如果您需要分配的内存大于该堆栈的大小,请使用malloc()。
它将指针返回到分配空间的第一个字节。
它使开发人员可以按需要分配确切数量的内存。
该函数从堆中分配字节的内存块大小。
为什么要使用calloc()?
下面是使用calloc()的原因:
当您必须将分配的内存设置为零时。
您可以使用calloc返回一个指针来访问内存堆。
需要将元素初始化为零以返回指向内存的指针时使用。
为了防止malloc()可能发生的溢出
使用calloc()请求已知已归零的页面。
malloc()的语法
下面是malloc()的语法
ptr = (cast_type *) malloc (byte_size);
在上述语法中,ptr是cast类型的指针。malloc函数返回一个指向字节大小的分配内存的指针。
ptr = (int *) malloc (50)
当此语句成功执行时,将保留50字节的内存空间。保留空间的第一个字节的地址分配给int类型的指针“ptr”。
calloc()的语法
下面是malloc()的语法
ptr = (cast_type *) calloc (n, size);
上面的语法用于分配相同大小的n个内存块。分配内存空间后,所有字节都初始化为零。返回当前位于分配内存空间的第一个字节的指针。
C中的malloc()示例
在下面的代码中,sizeof(*ptr)用于分配一个包含15个整数的内存块。在printf语句中,我们找到了第6个整数的值。
#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个整数的值是480。
C中的calloc()示例
下面的C语言程序计算前十项的总和。如果指针值为null,则不会分配内存空间。
For循环用于迭代变量“i”的值并打印总和。最后,函数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()之间的区别
以下是malloc()和calloc()之间的重要区别:
关键区别:
malloc()函数只返回起始地址,不将其置零另一方面,calloc()函数返回起始地址并将其置零。
在malloc函数中,参数数为2,而在calloc函数中,参数数为1。
malloc()时间效率高于calloc(),而malloc()与calloc()相比不安全。
malloc不初始化内存,而calloc执行内存初始化。
作者介绍