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

C99中执行free后对原指针做等值比较是否属于不安全操作?

你贴出的代码如下:

void *p1=malloc(1024);
free(p1);
void *p2=malloc(1024);
if (p1==p2)
{
    printf("Now What?")
}

结论:你的认知不正确,这段代码属于未定义行为,确实存在安全风险。

  • C语言标准明确规定:当指针指向的内存块被free释放后,该指针就成为无效指针,任何对无效指针的使用(哪怕只是读取它的值做比较,没有进行解引用访问内存)都属于未定义行为,没有任何可预期的运行结果。
  • 很多开发者会误以为指针只是存储内存地址的普通整型变量,只读它的值不会产生问题,但这个认知不符合C语言的抽象模型约定:指针的有效性和它指向的内存的生命周期强绑定,内存释放后指针的值本身就变为不确定状态,读取不确定值的行为天然就是未定义的。
  • 实际运行层面也存在可复现的风险:
    • 部分特殊硬件架构的指针并非普通整数,会携带权限、段标记等额外信息,内存释放后读取该指针的值可能直接触发硬件异常。
    • 现代编译器的优化逻辑会默认开发者不会执行未定义行为,完全可能直接将if (p1==p2)这个分支整体优化删除,或者返回完全不符合预期的比较结果——哪怕内存分配器确实把同一块地址重新分配给了p2,这段判断的结果也没有任何可靠性。
  • 最佳实践建议:指针free之后要么立即赋值为NULL,要么保证后续不会以任何形式使用这个指针。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:09:05