为什么这个程序工作?返回本地结构变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么这个程序工作?返回本地结构变量相关的知识,希望对你有一定的参考价值。

我有以下程序

#include <stdio.h>
#include<stdlib.h>

typedef struct point{
    int x;
    int y;
}point;

point add(int a, int b){
     int c;
     point p1;
     c= a+b;
     p1.x =c;
     p1.y =c;

     return(p1);
}

int main()
{
    int a=20,b=65;
    point k;
    k = add(a,b);


   printf("k.x=%d,k.y=%d\n",k.x,k.y);


   return 0;
}

o / p程序:

 k.x=85,k.y=85 

在函数add中,我正在创建一个临时变量p1并为其赋值,然后返回它。在main函数中,我使用返回的值来打印结构成员。

我的问题是这怎么可能?一旦我退出函数add,是不是我的局部变量p1被破坏了?如果是,那我怎么还能看到正确的值,即分配给p1的值?我错过了什么?

答案

return p1;获取可以在呼叫站点使用的p1的有价值副本。 (对于一个大型的struct,这在计算上可能相当昂贵,但我不会在这里担心 - 如果你有任何疑问,可以说明性能。)

你说在函数中声明的p1被破坏是正确的,但是在复制之后会发生这种情况。

(我故意删除了返回变量周围的括号,因为保持它们的风格很差。)

另一答案

在add(int a,int b)方法中,您将返回一个struct变量。在main方法中,将相同的返回值存储在另一个点变量(k)中。它将你的struct值复制到k中。因此,您可以访问printf函数中的值。

另一答案

你没有从add()返回局部变量。相反,您将局部变量复制到k。

返回point p1的副本而不是point p1本身

以上是关于为什么这个程序工作?返回本地结构变量的主要内容,如果未能解决你的问题,请参考以下文章

Android Java:在 onCreateView() 中返回空视图的片段

程序结构之返回指针的函数

Android片段中的手电筒 - SurfaceView

程序结构之静态本地变量

从类android获取位置

C程序存储结构