标题几乎总结了这一点。为什么我可以将本地创建的Point a(在函数ReadPoint()中)分配到一个不同范围的变量中。本地创建的Point a是否与函数readPoint()堆栈一起“弹出”?到底发生了什么?
struct Point readPoint(void)
{
struct Point a;
printf("x = ");
scanf("%lf",&b.x);
printf("y = ");
scanf("%lf",&b.y);
return a;
}
int main(int argc, char **argv) {
Point test = readPoint();
printPoint(test);
return 0
}
答案 0 :(得分:6)
struct
与原始类型没有什么不同。这与以下原则完全相同:
int foo(void)
{
int x = 5;
return x;
}
int main(void)
{
int y = foo();
printf("%d\n", y);
}
如何实现这一点的细节取决于实现。但通常,返回值(无论是int
还是struct
)由被调用函数放置到堆栈上,然后调用者可以访问该堆栈位置。
答案 1 :(得分:1)
将struct逐字节“复制”到main中的test
...就像从函数返回int
并将其赋值给变量一样。
但是,如果您返回指向struct
并取消引用它并指定(或类似)的指针,则不会发生这种情况。
答案 2 :(得分:1)
返回时,您将创建对象的副本(包含结构的所有成员),但仍然会破坏局部变量/对象。
除非你尝试返回一个引用或指针(在这些情况下你的编译器应警告你这个愚蠢的想法),否则这将有效。这样可以正常工作,除非你试图创建一个使用指针的东西的副本。
在C ++中,这也包括引用。
答案 3 :(得分:1)
这是因为从 readPoint()返回时,所有结构值都被复制到另一个本地定义的结构 test 。结构 a 无法生存。
答案 4 :(得分:0)
您所看到的是structure assignment。几乎所有现代编译器都可以处理这个问题。