C语言malloc与calloc区别

C语言内存管理:malloc与calloc的区别详解
本文对比了C语言中malloc和calloc在内存分配方式、参数、用法及特点上的差异,通过实例展示两者的异同,帮助理解内存初始化的差别。

C语言malloc与calloc区别

区别

开门见山,malloc与calloc在内存分配时,前者分配一整块,后者分配n块,并且后者在分配时会将内存置为0,前者不会内存里是垃圾数据。

另外它们参数不同,malloc参数只有一个无符号整型的num表示分配的字节数,函数原型如下

void *malloc(size_t num);

calloc参数有两个,分别是无符号整型num表示分配的对象的个数,以及无符号整型size表示每个对象的大小

void *calloc(size_t num, size_t size);

用法

它们在用法上相似,可以起到相同的效果,并且都返回内存的首地址。

以分配容纳5个int整型的空间为例,代码如下

malloc用法

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

int main()
{
	int *p = (int*)malloc(5*sizeof(int));
	for(int i=0; i<5; i++)
		p[i]=i;

	for(int i=0; i<5;i++)
		printf("%d ",p[i]);

	return 0;
}

calloc用法

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

int main()
{
	int *p = (int*)calloc(5,sizeof(int));
	for(int i=0; i<5; i++)
		p[i]=i;
	for(int i=0; i<5; i++)
		printf("%d ",p[i]);

	return 0;
}

运行结果

运行结果相同

0 1 2 3 4
在C语言中,`malloc`、`calloc` `realloc` 是用于动态内存分配的核心函数,它们允许程序在运行时根据需要申请调整内存空间,从而提升程序的灵活性效率。 ### `malloc`:分配未初始化的内存块 `malloc` 函数用于分配指定大小的内存空间,返回一个指向该内存块的指针。分配的内存不会被初始化,其内容是未定义的。该函数的原型为: ```c void* malloc(size_t size); ``` 例如,分配一个包含10个整数的数组: ```c int *arr = (int *)malloc(10 * sizeof(int)); ``` 若分配失败,`malloc` 返回 `NULL`。由于分配的内存未初始化,使用前需手动赋值,否则读取未初始化的数据会导致未定义行为[^1]。 ### `calloc`:分配并初始化为零的内存块 `calloc` `malloc` 类似,但其会将分配的内存初始化为零。其原型为: ```c void* calloc(size_t num, size_t size); ``` 其中 `num` 表示元素个数,`size` 表示每个元素的大小(以字节为单位)。例如: ```c int *arr = (int *)calloc(10, sizeof(int)); ``` `malloc` 不同的是,`calloc` 在返回地址之前会将每个字节初始化为零,因此适用于需要初始化为默认值的数据结构[^2]。 ### `realloc`:调整已分配内存块的大小 `realloc` 用于调整先前由 `malloc`、`calloc` 或 `realloc` 分配的内存块的大小。其原型为: ```c void* realloc(void* ptr, size_t size); ``` 其中 `ptr` 是指向之前分配的内存块的指针,`size` 是新的内存大小。如果当前内存块后有足够空间,`realloc` 会直接扩展;否则,会分配一个新的内存块并将原有数据复制过去。例如: ```c int *new_arr = (int *)realloc(arr, 20 * sizeof(int)); ``` 若调整失败,原内存块保持不变,且返回值为 `NULL`。因此在使用 `realloc` 后应检查返回值,并在成功后更新指针[^3]。 ### 三者的区别总结 | 特性 | `malloc` | `calloc` | `realloc` | |------------------|-----------------------|------------------------------|--------------------------| | 初始化 | 不初始化 | 初始化为零 | 不改变原有数据内容 | | 参数 | 单一大小(字节) | 元素个数元素大小 | 指针新大小 | | 内存调整 | 不支持调整 | 不支持调整 | 支持调整已分配内存 | | 返回值失败处理 | 返回 `NULL` | 返回 `NULL` | 返回 `NULL`,原内存不变 | ### 示例代码 以下是一个综合使用 `malloc`、`calloc` `realloc` 的示例: ```c #include <stdio.h> #include <stdlib.h> int main() { int *array1 = (int *)malloc(5 * sizeof(int)); if (array1 == NULL) { return 1; } int *array2 = (int *)calloc(5, sizeof(int)); if (array2 == NULL) { free(array1); return 1; } int *array3 = (int *)realloc(array1, 10 * sizeof(int)); if (array3 == NULL) { free(array1); free(array2); return 1; } free(array2); free(array3); return 0; } ``` --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值