malloc 和 realloc 之间的区别

17 Mar 2025 | 6 分钟阅读

引言

内存分配是编程中一个重要部分,尤其是在像C语言这样需要手动管理内存的语言中。在C语言中,动态内存分配的两个基本函数是malloc和realloc。这两个函数在运行时管理内存方面发挥着关键作用,但它们的服务目的不同。本文旨在探讨malloc和realloc之间复杂的区别,阐明它们的功能、用例以及对有效的内存管理的影响。

C语言中的内存分配

在深入了解malloc和realloc的具体细节之前,理解C语言中动态内存分配的概念至关重要。与静态内存分配(内存大小在编译时确定)不同,动态内存分配允许程序在运行时分配内存。在处理大小可变的数据结构或事先不知道确切内存需求时,这种灵活性至关重要。

什么是malloc?

malloc是C编程语言中的一个函数,意思是“内存分配”。它是标准C库的一部分,用于程序执行期间的动态内存分配。

Difference between malloc and realloc

以下是malloc工作原理的简要概述

目的:malloc用于在运行时分配指定量的内存。它允许程序根据需要请求内存,而不是完全依赖于固定大小的数组。

语法

参数

大小:要分配的内存量,以字节为单位确定。

返回值

  • 如果内存分配成功,malloc返回指向分配内存块起始位置的指针。
  • 如果分配失败(例如,由于内存不足),malloc返回NULL。

示例

在此示例中,malloc用于为5个整数的数组分配内存。sizeof(int)用于确保根据整数的大小分配正确的内存量。

内存初始化

由malloc分配的内存是未初始化的,这意味着其内容是不可预测的。开发人员必须根据需要初始化内存。

内存释放

在使用完分配的内存后,必须使用free函数释放它以防止内存泄漏。

free(array);

  • malloc是C项目中管理动态内存的关键,与静态内存分配相比,它能够实现更灵活和高效的内存使用。

什么是realloc?

realloc是C编程语言中的一个函数,意思是“重新分配”。它是标准C库的一部分,用于在运行时调整先前分配的内存块的大小。它允许更灵活的内存管理,尤其是在数据结构大小需要动态更改时。

Difference between malloc and realloc

以下是realloc工作原理的简要概述

目的:realloc用于更改全局分配的内存块的大小。它可以增加或减少块的大小。

语法

ptr:指向需要调整大小的最近分配的内存块的指针。

大小:内存块的新大小,以字节为单位确定。

返回值

  • 如果重新分配成功,realloc返回指向调整大小(或新分配)的内存块起始位置的指针。
  • 如果分配失败(例如,由于需要更多内存),malloc返回NULL。

示例

内存内容保留

  • 如果块的大小增加,则现有块的内容将保留到旧大小和新大小的最小值。
  • 如果大小减小,则末尾多余的内存将被释放。

内存初始化

  • 与malloc类似,新分配或调整大小的内存是未初始化的。程序员必须根据需要初始化内存。

内存释放

  • 在使用完调整大小或新分配的内存后,当不再需要时,必须使用free函数释放它。
  • realloc是C语言中用于管理动态内存的强大工具,允许在程序执行期间高效地更改内存块的大小。

差异

mallocrealloc
初始分配与调整大小此功能用于内存的初始分配。它创建一个指定大小的新内存块,并且块的内容是未初始化的。它们用于调整现有内存块的大小。根据新的大小边界,块可以扩展或收缩。
函数签名void* malloc(size_t size);
接受一个参数,即要分配的内存块的大小(以字节为单位)。
返回一个void指针(void*),指向分配块的起始位置。
void* realloc(void* ptr, size_t size);
接受两个参数 - 指向现有内存块的指针(ptr)和块的新大小(以字节为单位)。
返回一个void指针,指向调整大小块的起始位置。
输入参数只接受要分配的内存大小。接受指向现有内存块的指针和新大小作为参数。
处理现有数据分配一个新的内存块,而不保留先前分配块中的数据。新块的内容是未初始化的。在调整大小时保留现有块中的数据。如果新块更大,则额外空间是未初始化的。
返回值返回指向新分配内存块起始位置的指针。如果分配失败,则返回空指针。返回指向调整大小内存块起始位置的指针。此指针可能与原始指针相同,也可能不同。如果重新分配失败,则返回空指针,并保持原始块不变。
空指针处理如果无法分配请求的内存,则返回空指针。如果无法调整内存块的大小,则返回空指针,并且原始块保持不变。
动态数组的使用通常在创建动态数组或首次分配内存时使用。通常在运行时需要调整动态数组大小时使用。它允许高效调整大小,而无需创建新数组和复制数据。
显式释放内存为了防止内存泄漏,使用malloc分配的内存应在不再需要时使用free函数显式释放。使用realloc重新分配的内存可能涉及释放原始块。realloc返回的指针可以直接使用,无需为原始块单独调用free。
处理重新分配失败如果内存分配失败,则返回空指针。如果重新分配失败,则返回空指针,并且原始块保持不变。它允许优雅的错误处理,而不会丢失原始数据。
性能考虑当事先知道大小时,通常在分配内存方面更高效,因为它避免了不必要的数据复制。如果内存块需要移动到不同的位置,它可能涉及数据复制,从而影响大块的性能。但是,它提供了调整现有内存大小的优势,而无需手动内存管理。

实施

输出

Difference between malloc and realloc

说明

  1. 程序首先使用malloc为整数数组(dynamicArray)分配内存。初始数组的大小设置为5。
  2. 程序检查内存分配是否成功。如果失败,则打印错误消息并以错误代码退出。
  3. 程序初始化并打印初始数组元素(2的倍数),以演示动态分配数组的内容。
  4. 然后,程序使用realloc将数组大小调整为10。
  5. 与初始分配类似,程序检查内存重新分配是否成功。如果失败,则打印错误消息,释放由malloc分配的内存,并以错误代码退出。
  6. 程序初始化并打印调整大小数组中的新元素,演示realloc如何保留现有数据。
  7. 最后,程序使用free函数释放由realloc分配的内存。