📜  malloc()和calloc()之间的区别与示例(1)

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

malloc()和calloc()之间的区别与示例

在C语言中,malloc()和calloc()是申请内存的常用函数。它们有一些区别,下面将对它们进行详细介绍。

区别
  1. 参数不同

    malloc()函数只接受一个参数,表示要申请的内存字节数;而calloc()函数需要两个参数,第一个参数表示要申请的内存块数量,第二个参数表示每个内存块的大小。

  2. 内存内容不同

    malloc()函数申请的内存中的内容是随机的,可能包含旧数据,需要在申请后进行初始化;而calloc()函数申请的内存中的内容全部被初始化为0。

  3. 速度不同

    由于calloc()在申请内存时需要对内存进行初始化,所以相对于malloc()来说,它的速度可能会更慢一些。

  4. 返回值不同

    malloc()函数返回申请内存的指针,而calloc()返回申请内存的首地址。

示例

下面是使用malloc()和calloc()函数申请内存的示例代码。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n = 5;
    int *p1, *p2;
    p1 = (int*) malloc(n * sizeof(int)); // 申请长度为n的int型数组的空间
    p2 = (int*) calloc(n, sizeof(int)); // 申请长度为n的int型数组的空间

    if (p1 == NULL || p2 == NULL) // 判断是否申请成功
    {
        printf("Error: failed to allocate memory.\n");
        return -1;
    }

    for (int i = 0; i < n; i++) 
    {
        *(p1 + i) = i + 1; // 给p1动态分配的数组中的数赋值
        *(p2 + i) = i + 1; // 给p2动态分配的数组中的数赋值
    }

    printf("p1: ");
    for (int i = 0; i < n; i++)
    {
        printf("%d ", *(p1 + i));
    }
    printf("\n");

    printf("p2: ");
    for (int i = 0; i < n; i++)
    {
        printf("%d ", *(p2 + i));
    }

    free(p1); // 释放p1动态分配的数组的内存
    free(p2); // 释放p2动态分配的数组的内存

    return 0;
}

在上面的示例代码中,首先使用malloc()和calloc()函数分别申请了长度为5的int型数组的空间。然后在循环中给它们赋值,最后输出它们的值。最后使用free()函数释放申请的内存。需要注意的是,使用malloc()和calloc()函数申请的内存空间一定要记得在使用完后及时释放,否则会造成内存泄漏。