为何调用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,原因可以拆成两点说:
realloc(0,0)的行为是实现定义的
C语言标准并没有强制要求realloc(NULL, 0)必须返回NULL,它允许具体实现返回一个能被free()安全释放的非空指针——像glibc的ptmalloc这类主流内存分配器,就会返回一个指向内部“空块”的指针。访问指针[-1]是未定义行为,恰好命中分配器元数据
当p是这个非空指针时,((int*)p)[-1]等价于*(p - 1),也就是访问p指向地址前一个int大小的内存区域。而多数堆分配器会在每个内存块的前方存储元数据(比如块的大小、使用状态标记等),这里的17就是这块元数据里的某个值——完全是当前分配器实现的巧合,换个编译器、系统或者运行环境,结果可能是任意数字,甚至直接导致程序崩溃。
本质上这段代码的行为完全不受C标准保障,17只是特定内存分配器下的偶然结果,属于典型的未定义行为。
内容的提问来源于stack exchange,提问作者Dhinesh Kumar
相关产品推荐
相关产品推荐

