You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何调用realloc(0,0)的C语言程序输出结果为17?

调用realloc(0,0)后输出17的原因解释

先看这段代码:

#include<stdio.h>
#include<stdlib.h>
int main()
{
 int* p=(int*)realloc(0,0);
 printf("%d\n",((int*)p)[-1]);
}

运行后输出结果为17,原因可以拆成两点说:

  1. realloc(0,0)的行为是实现定义的
    C语言标准并没有强制要求realloc(NULL, 0)必须返回NULL,它允许具体实现返回一个能被free()安全释放的非空指针——像glibc的ptmalloc这类主流内存分配器,就会返回一个指向内部“空块”的指针。

  2. 访问指针[-1]是未定义行为,恰好命中分配器元数据
    当p是这个非空指针时,((int*)p)[-1]等价于*(p - 1),也就是访问p指向地址前一个int大小的内存区域。而多数堆分配器会在每个内存块的前方存储元数据(比如块的大小、使用状态标记等),这里的17就是这块元数据里的某个值——完全是当前分配器实现的巧合,换个编译器、系统或者运行环境,结果可能是任意数字,甚至直接导致程序崩溃。

本质上这段代码的行为完全不受C标准保障,17只是特定内存分配器下的偶然结果,属于典型的未定义行为。

内容的提问来源于stack exchange,提问作者Dhinesh Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 13:20:27