C 语言 malloc(), calloc(), realloc() 函数的区别

2025年1月7日 | 阅读 4 分钟

在本文中,我们将学习 C 语言中 malloc(), calloc(),realloc() 函数之间的区别。在了解函数之间的区别之前,我们需要了解 C 语言中的动态内存分配以及上述三个函数的用途。

什么是动态内存分配?

它是程序运行时,而不是编译阶段,为数据结构分配内存的过程。这种方法提供了灵活性和效率。函数如 malloc, callocrealloc 用于此目的。动态分配允许您根据需要分配内存,从而最大限度地减少浪费并更好地利用资源。在处理数组和链表等复杂数据结构时,这是必不可少的。当处理大小不固定的数据时,它尤其有用,这使得程序具有适应性,能够处理各种任务。

动态内存分配中使用的函数有:

Malloc: 它分配指定大小的内存并返回一个指针。它不初始化内存,这使得它对于任意数据结构都很高效。

Calloc: 此函数分配内存并将其初始化为 。它是数组和复杂结构的理想选择,确保所有元素都以定义的初始值开始。

Realloc: 它动态调整先前分配的内存大小,在扩展或缩减数组时保留现有数据。它减少了手动内存管理的需要,提高了代码效率和可读性。当运行时数据结构的大小发生变化时,Realloc 至关重要。

示例

现在,我们来看一个关于 malloccalloc 如何工作的程序。

输出

Difference between the malloc(), calloc(), realloc() functions in C

说明

在此示例中,我们初始化了两个整数数组,dynamicArrayMallocdynamicArrayCalloc,它们的长度均为 5。首先,它使用 mallocdynamicArrayMalloc 分配内存,并将其元素初始化为偶数。之后,它使用 callocdynamicArrayCalloc 分配内存,并将元素初始化为零。程序使用奇数更新 dynamicArrayCalloc。最后,它打印两个数组,并释放已分配的内存以防止内存泄漏。

示例

现在,我们来看另一个关于 realloc 如何工作的程序。

输出

Difference between the malloc(), calloc(), realloc() functions in C

说明

在此示例中,我们为整数数组 dynamicArray 分配内存,初始大小为 5。在用偶数初始化它之后,程序使用 realloc 将内存重新分配给容纳 10 个元素。它在调整大小时保留现有数据。之后,它根据其位置填充附加元素。该程序打印初始数组和调整大小后的数组,强调了动态内存分配的灵活性。

Malloc、Calloc 和 Realloc 的头对头比较

现在,所有函数之间的区别是:

方面malloccallocrealloc
用途分配未初始化的内存。分配并初始化为零更改现有分配的大小
语法void* malloc(size_t size);void* calloc(size_t num, size_t size);void* realloc(void* ptr, size_t size);
初始化内存内容未初始化。内存被初始化为零。调整大小时可能保留现有数据。
参数数量它接受一个参数(大小)。它接受两个参数(num,size)。它接受两个参数(ptr,size)。
返回值指向已分配内存的指针或 NULL指向已分配内存的指针或 NULL指向已重新分配内存的指针或 NULL
用途通常用于单个对象。通常用于数组或多个对象。用于调整现有分配的大小。
内存清理不执行内存清理。分配期间内存被清理(设置为零)根据实现,可能清除内存,也可能不清除。
函数开销由于没有初始化,通常更快。由于初始化,速度稍慢。可能涉及复制和初始化。
典型应用用于任意大小的数据结构。通常用于数组、矩阵和复杂数据结构。当您需要调整现有分配的大小时使用。
内存泄漏如果未释放,则可能发生内存泄漏。如果未释放,则可能发生内存泄漏。如果未释放,则可能发生内存泄漏。