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

指向返回结构体成员的指针是否安全?代码实例相关疑问

问题解答

先给结论:变量str指向的内存已经失效,这个操作不安全,属于未定义行为。

具体解释:

  • 函数f返回的是结构体A的值,当f执行完毕返回时,会把f栈帧里的ret结构体内容,拷贝到main函数栈帧中的一个临时匿名对象里,用来存储返回值。
  • 但char *str = f().s;这行代码中,f()返回的临时对象是右值,这条语句执行完成后,这个临时对象就会被销毁,它占用的栈内存会被释放(或被后续栈操作覆盖)。
  • str保存的是这个临时对象内部s数组的地址,临时对象销毁后,str就变成了野指针,此时调用puts(str)访问这块内存,结果是未定义的——可能碰巧输出正确内容,也可能程序崩溃,或者输出乱码,完全取决于编译器实现和运行时的栈状态。

如果要让操作安全,需要把返回的结构体保存到main的命名变量中,比如:

int main()
{
    struct A a = f();
    char *str = a.s;
    
    puts(str);
}

此时a位于main的栈帧中,只要a的生命周期没结束,str指向的就是有效的内存区域。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:57:04