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

Sca*_*nth 2 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
        }
Run Code Online (Sandbox Code Playgroud)

Oli*_*rth 6

struct在这方面,s与原始类型没有什么不同.它的原理完全相同:

int foo(void)
{
    int x = 5;
    return x;
}

int main(void)
{
    int y = foo();
    printf("%d\n", y);
}
Run Code Online (Sandbox Code Playgroud)

如何实现这一点的细节取决于实现.但通常,返回值(无论是a int还是a struct)由被调用函数放置到堆栈上,然后调用者可以访问该堆栈位置.