📜  calloc vs malloc (1)

📅  最后修改于: 2023-12-03 15:14:05.579000             🧑  作者: Mango

动态内存分配函数 calloc 和 malloc

在 C 语言中,动态内存分配是非常重要的一部分。使用动态内存,程序在执行期间可以根据需要自由地申请和释放内存,以有效地利用计算机内存资源。在内存分配中,C 语言提供了两个重要的函数——callocmalloc。本篇文章将会介绍它们的使用方法以及注意事项。

1、calloc

calloc函数是 C 语言中常用的内存申请函数。它可以在内存中连续地分配一定数量的区域并且将它们初始化为零。使用方法是:

void *calloc(size_t num, size_t size);

其中,num 参数表示需要开辟的区域的数量,size 参数表示每个区域的大小。calloc 函数返回一个指向开辟区域的指针,如果空间分配失败,calloc 返回一个NULL指针,表示内存空间不足。

注意,calloc 函数所开辟的空间,内部都被初始化成二进制0,而不是 ASCII 码中的 0(即空格字符 ' '),如果是字符数组或字符串,calloc 函数分配后需要用到 memset 函数进行初始化。

2、malloc

malloc函数也是 C 语言中常用的内存申请函数,和 calloc 不同的是,malloc 不会进行内存空间的初始化。使用方法是:

void *malloc(size_t size);

其中,size 参数表示需要开辟的空间的大小。malloc 函数返回一个指向开辟区域的指针,如果空间分配失败,malloc 返回一个NULL指针,表示内存空间不足。

可以使用 memset 函数进行内存的初始化。例如下面代码实现沿用calloc来节省代码实现

 char *str;
 str = (char *) malloc(15*sizeof(char));
 if(str == NULL){
     printf("分配内存空间失败!\n");
 } else {
     memset(str, 0, sizeof(char)*15);
 }
3、calloc 和 malloc 的区别
  • calloc 所分配的内存空间默认都是0(即被初始化为0),而 malloc 则不进行初始化。

  • calloc 需要两个参数(即需要开辟的区域数量和每个区域的大小),而 malloc 只需要一个参数(需要开辟的空间大小)。

  • calloc 执行较慢,因为它需要对已分配的所有空间进行一次归零,而 malloc 则不需要。但 calloc 确保分配的内存空间被初始化为 0,在一些情况下这是非常有用的。

  • 在申请内存的时候,如果是一个结构体数组,每个被分配的块的大小并不是固定的,使用calloc 就需要多开辟的空间来储存结构体,所以此时使用malloc 会更好。

4、总结

无论是 calloc 还是 malloc,使用时都需要注意在申请内存的同时也需要及时释放内存,避免内存泄露。严密的内存管理是程序的安全和可靠的一个因素。

两者使用时,需要考虑自己的需求,根据需要选择相应的函数。