为什么这个值在函数返回后仍然存在?

时间:2011-12-12 18:44:08

标签: c memory

标题几乎总结了这一点。为什么我可以将本地创建的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
        }

5 个答案:

答案 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。几乎所有现代编译器都可以处理这个问题。