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; }