指向返回结构体成员的指针是否安全?代码实例相关疑问
问题解答
先给结论:变量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
相关产品推荐
相关产品推荐

