指向返回结构体成员的指针,安全吗?

问题描述 投票:0回答:1

例如:

struct A { char s[10]; } f() {
    return (struct A){"hello"};
}

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

str
是否指向有效字符串?或者已经被释放了?

如果安全的话,那么字符串

"hello"
存储在哪里? main 的栈帧?

c pointers struct return
1个回答
0
投票

我认为整个代码是

#include <stdio.h>
struct A { char s[10]; };
struct A f() {
    return (struct A){"hello"};
}
int main()
{
    char *str = f().s; 
    puts(str);
}

当函数 f() 返回时,其堆栈帧确实被销毁,但通常存储的返回值

(struct A){"hello"}
将保留在 main func 的堆栈帧中。当调用
puts(str);
时,它会指向存储(struct A){"hello"}的内存位置。

你应该知道,返回时将

(struct A){"hello"}
复制到堆栈中是低效的。

© www.soinside.com 2019 - 2024. All rights reserved.