C语言面试题更新 2026-08-05

请详细说明 C 语言中 malloc、calloc 和 realloc 这三种动态内存分配函数的差异,包括它们各自的功能、参数、初始化行为以及适用场景。

编码实现技术原理

考察说明

考察对 C 语言动态内存管理函数特性的理解与区分能力。

回答思路

  1. 【回答框架 1】malloc 函数用于分配指定字节数的未初始化内存块,其原型为 void *malloc(size_t size),分配的内存内容不确定。calloc 函数则分配 nmemb 个元素,每个元素大小为 size,并将分配的内存全部初始化为零,原型为 void *calloc(size_t nmemb, size_t size)。realloc 用于调整已分配内存块的大小,原型为 void *realloc(void *ptr, size_t size),可能会移动内存块。
  2. 【回答框架 2】在参数上,malloc 仅需指定总字节数;calloc 需要元素个数和每个元素大小,且会进行乘法溢出检查(返回 NULL 或失败);realloc 需要原指针和新大小。在初始化上,calloc 保证清零,malloc 不保证,realloc 不会初始化新增部分。
  3. 【回答框架 3】realloc 的行为依赖于原指针:若 ptr 为 NULL,则等价于 malloc;若 size 为 0,则相当于 free 并可能返回 NULL 或一个可释放的空指针。realloc 成功时,原指针可能失效,必须使用返回的新指针;失败时,原内存块不变,返回 NULL。
  4. 【回答框架 4】适用场景:malloc 用于分配结构体或数组等无需初始化的情况;calloc 适用于需要清零的内存区域,例如数组或位图;realloc 用于动态扩展或收缩已分配的内存,例如实现动态数组。
  5. 【回答框架 5】性能上,calloc 由于需要清零可能稍慢,但在需要零初始化时更安全;realloc 可能涉及内存拷贝,频繁使用会带来开销。
  6. 【关键点 1】malloc 不初始化内存,calloc 将分配的内存初始化为零。
  7. 【关键点 2】calloc 参数为元素个数和元素大小,会乘出总字节数;malloc 只接受总字节数。
  8. 【关键点 3】realloc 调整内存大小,可能移动内存块,成功后必须使用返回值。
  9. 【关键点 4】realloc 失败时原指针仍有效,应妥善处理避免内存泄漏。
  10. 【易错点 1】误认为 malloc 分配的内存自动清零,实际上其内容是不确定的。
  11. 【易错点 2】realloc 失败时直接令原指针赋值为 NULL,导致原内存泄漏。
  12. 【易错点 3】忽视 calloc 参数乘积可能溢出,虽然实现通常检查,但应留意极端情况。