局部变量与全局变量的问题

匚匚 2009-11-06 02:23:13
下面的temp是局部变量吗?函数makepoint返回的是结构体?调用结构后temp会释放吗?

struct point /*定义结构体类型*/
{
double x;
double y;
};
struct point makepoint(double x,double y) /*给坐标点赋值函数*/
{
struct point temp;
temp.x=x;
temp.y=y;
return temp;
}
...全文
172 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ddm3020 2009-11-06
  • 打赏
  • 举报
回复
顶9楼
匚匚 2009-11-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zuolong1 的回复:]
楼上说法正确,子函数返回后栈指针将会回退到调用该函数的地址继续执行,子函数中声明的变量将无法找到。
[/Quote]
感觉太绝对!还有可能找到,当然只是有此可能,但绝对不能这样去引用
zuolong1 2009-11-06
  • 打赏
  • 举报
回复
楼上说法正确,子函数返回后栈指针将会回退到调用该函数的地址继续执行,子函数中声明的变量将无法找到。
苍蝇①号 2009-11-06
  • 打赏
  • 举报
回复
这属于存在栈上的数据,函数返回时栈就销毁了
cir2633 2009-11-06
  • 打赏
  • 举报
回复
C里的变量域分4种
1文件域
2块域(形参也属于此)
3函数原型定义域
4函数域

temp属于3,会被释放
jenf 2009-11-06
  • 打赏
  • 举报
回复
struct point pt = makepoint(...);
你写上类似上面的任何样式的赋值表达式,都会正确无误地获取返回值,没有任何问题,因为返回值会复制到你的变量pt中,你得到的并非返回值本身,返回值本身那个局部变量在这时候就由编译器释放了。
匚匚 2009-11-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jenf 的回复:]
编译器会释放,不用自己动手。
[/Quote]
它当然会自动释放,我们讨论的是它释放主调函数还能不能得到它的值
jenf 2009-11-06
  • 打赏
  • 举报
回复
编译器会释放,不用自己动手。
匚匚 2009-11-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 selooloo 的回复:]
temp的接收是个问题啊
[/Quote]

个人觉得,返回的是一个结构体,也就是结构体成员都返回到主调函数,temp释放了也毫无影响!
不知对否,请指正
t1397018 2009-11-06
  • 打赏
  • 举报
回复
全局变量是在程序运行前就定义的
即放在主函数的外面
而在{}内的就可以认为是局部变量
selooloo 2009-11-06
  • 打赏
  • 举报
回复
temp的接收是个问题啊
xsh123321 2009-11-06
  • 打赏
  • 举报
回复
temp是局部变量,返回后会销毁。
buptzwp 2009-11-06
  • 打赏
  • 举报
回复
是 是 会
匚匚 2009-11-06
  • 打赏
  • 举报
回复
#include "stdio.h"
#include "math.h"

struct point /*定义结构体类型*/
{
double x;
double y;
};
struct point makepoint(double x,double y) /*给坐标点赋值函数*/
{
struct point temp;
temp.x=x;
temp.y=y;
return temp;
}
double rule(struct point p1,struct point p2) /*求两点距离函数*/
{
return sqrt(((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)));
}

double aef(struct point a, struct point b) /*求坐标方位角函数*/
{
double r,z;
if (b.y==a.y) return 0.0; /*平行于X轴(测量坐标系)*/
if (b.x==a.x) return b.y-a.y>0?90.0:270.0; /*平行于Y轴*/
z=(b.y-a.y)/(b.x-a.x); /*正切值*/
r=atan(z)*180/3.141592654; /*反正切值即象限角*/
if (b.y-a.y<0&&b.x-a.x<0) return fabs(r)+180.0; /*第三象限*/
if (b.y-a.y>0&&b.x-a.x>0) return r; /*第一象限*/
if (b.y-a.y>0&&b.x-a.x<0) return 180.0-fabs(r); /*第二象限*/
if (b.y-a.y<0&&b.x-a.x>0) return 360.0-fabs(r); /*第四象限*/
}

int main(void) /*知三点坐标,求夹角*/
{
double x1,x2,y1,y2,x0,y0;
struct point p1,p2,p0; /*定义结构体变量*/
while (8)
{
printf("\t\t\t\t伟成工作室荣誉出品\n\n");
printf("请输入两端点坐标:");
scanf("%lf,%lf %lf,%lf" ,&x1,&y1,&x2,&y2);
printf("请输入(角)顶点坐标:");
scanf("%lf,%lf",&x0,&y0);
p1=makepoint(x1,y1); /*给结构体变量赋值*/
p2=makepoint(x2,y2);
p0=makepoint(x0,y0);
printf("\n顶点对边边长:%f\n",rule(p1,p2));
printf("顶点夹角为:%f\n",aef(p0,p1)-aef(p0,p2));
}
}



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhw952/archive/2009/11/01/4754790.aspx

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧