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

C语言中结构体释放后main函数内assert断言失败的原因咨询

为什么free_struct内部的assert通过,但main里的assert失败?

核心原因是C语言的函数参数是传值调用:

  • 当你把main中的指针s传入free_struct时,函数会创建一个该指针的副本,函数内部对s的所有修改都是针对这个副本的,和main里的原指针毫无关系。
  • free_struct里的s = NULL只是把函数内部的指针副本设为NULL,所以这个位置的assert(s == NULL)能通过,但main里的原指针还是保留着原来的内存地址(此时已经是被释放的野指针),因此main里的assert(s == NULL)会失败。

解决方法:使用双重指针修改原指针

如果希望free_struct能把main里的指针也置为NULL,需要传递指针的指针(双重指针),让函数能直接修改原指针的内容:

修改后的free_struct函数:

void free_struct(Struct** s) {
    if (!s || !*s) {
        return;
    }
    free(*s);
    *s = NULL; // 直接修改原指针指向的内容
    assert(*s == NULL);
}

在main中的调用方式改为:

free_struct(&s);

这样main里的s就会被正确置为NULL,后续的assert(s == NULL)就能正常通过,同时也避免了原指针成为野指针带来的潜在风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 21:15:03