C语言 中malloc 分配指定大小的内存,但内存内容未初始化,包含随机垃圾值。calloc 分配指定数量和大小的内存,并将所有内存字节初始化为零。

1、 malloc

malloc(memory allocation)是用于分配一块指定大小的内存区域,但它不会初始化这些内存空间的内容。malloc 为程序分配一块大小为 size 字节的内存区域,但不会初始化内存中的数据。内存中的值是未定义的(即包含垃圾值)。成功时返回指向分配内存的指针,失败时返回 NULL

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

int main() {
    // 分配10个整数大小的内存
    int* arr = (int*) malloc(10 * sizeof(int));

    // 检查内存是否分配成功
    if (arr == NULL) {
        // 处理内存分配失败
        printf("内存分配失败\n");
        return 1;  // 返回非零值表示程序异常终止
    }

    // 如果内存分配成功,初始化数组并输出
    for (int i = 0; i < 10; i++) {
        arr[i] = i * i;  // 将数组元素设置为i的平方
    }

    // 打印数组中的值
    printf("数组内容:\n");
    for (int i = 0; i < 10; i++) {
        printf("arr[%d] = %d\n", i, arr[i]);
    }

    // 释放内存
    free(arr);
    return 0;
}

2、calloc

calloc(contiguous allocation)除了分配内存外,还会将分配的内存空间初始化为零。calloc 分配了一个大小为 num * size 字节的内存区域,并将这些内存中的每个字节初始化为零(即所有字节值为 0)。成功时返回指向分配内存的指针,失败时返回 NULL

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

int main() {
    // 分配10个整数大小的内存并初始化为0
    int* arr = (int*) calloc(10, sizeof(int));

    // 检查内存是否分配成功
    if (arr == NULL) {
        // 处理内存分配失败
        printf("内存分配失败\n");
        return 1;  // 返回非零值表示程序异常终止
    }

    // 如果内存分配成功,打印数组中的值(应全为0)
    printf("数组内容:\n");
    for (int i = 0; i < 10; i++) {
        printf("arr[%d] = %d\n", i, arr[i]);
    }

    // 释放内存
    free(arr);
    return 0;
}

3、malloc 和 calloc 区别

malloc 不会初始化分配的内存,内存中的值是不确定的;而 calloc 会将分配的内存初始化为零。malloc 只接受一个参数,即所需内存的大小(字节数);calloc 接受两个参数,第一个是元素的数量,第二个是每个元素的大小。

因为 calloc 会初始化内存,所以它的性能可能稍微比 malloc 慢一些,尤其是在分配大量内存时。

如果程序不需要初始化内存,使用 malloc 会更有效率。如果你需要将内存初始化为零,那么使用 calloc 会更方便。

如果你需要快速分配内存并且不关心其初始值,可以使用 malloc

如果你需要分配内存并且希望内存初始化为零(比如数组或结构体中的整数为零),可以使用 calloc

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

int main() {
    int *arr_malloc, *arr_calloc;
    int n = 5;

    // 使用 malloc 分配内存
    arr_malloc = (int *)malloc(n * sizeof(int));
    if (arr_malloc == NULL) {
        printf("malloc failed\n");
        return 1;
    }

    // 使用 calloc 分配内存
    arr_calloc = (int *)calloc(n, sizeof(int));
    if (arr_calloc == NULL) {
        printf("calloc failed\n");
        return 1;
    }

    // 打印 malloc 分配的内存内容(未初始化,可能是垃圾数据)
    printf("malloc allocated array (uninitialized values):\n");
    for (int i = 0; i < n; i++) {
        printf("arr_malloc[%d] = %d\n", i, arr_malloc[i]);  // 可能输出未定义值
    }

    // 打印 calloc 分配的内存内容(初始化为 0)
    printf("\ncalloc allocated array (initialized values):\n");
    for (int i = 0; i < n; i++) {
        printf("arr_calloc[%d] = %d\n", i, arr_calloc[i]);  // 输出 0
    }

    // 释放内存
    free(arr_malloc);
    free(arr_calloc);

    return 0;
}

推荐文档

相关文档

大家感兴趣的内容

随机列表