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
相关产品推荐
相关产品推荐

