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