免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 13607 | 回复: 10
打印 上一主题 下一主题

警告:function returns address of local variable [复制链接]

论坛徽章:
5
未羊
日期:2014-08-07 15:42:10双子座
日期:2014-09-23 15:42:172015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:282022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-09 13:09 |只看该作者 |倒序浏览
写了一个函数:

  1. int *screenCenter( int width,int height)
  2. {
  3.      int wh[2];
  4.      int cxScreen, cyScreen ;
  5.      cxScreen = GetSystemMetrics (SM_CXSCREEN) ;
  6.      cyScreen = GetSystemMetrics (SM_CYSCREEN) ;
  7.      //int width=800,height=600;
  8.      wh[0]=cxScreen/2-width/2;
  9.      wh[1]=cyScreen/2-height/2;
  10.      return wh;
  11.       
  12. }
复制代码

运行后提示:function returns address of local variable?

论坛徽章:
0
2 [报告]
发表于 2009-02-09 13:18 |只看该作者

回复 #1 光速 的帖子

问题不是很明显么?

论坛徽章:
5
未羊
日期:2014-08-07 15:42:10双子座
日期:2014-09-23 15:42:172015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:282022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32
3 [报告]
发表于 2009-02-09 13:24 |只看该作者
俺比较笨,请教解决方法

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
4 [报告]
发表于 2009-02-09 13:26 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2009-02-09 13:27 |只看该作者
你返回了函数的局部变量的地址,如果你使用地址指向的内容,结果是未知的

论坛徽章:
0
6 [报告]
发表于 2009-02-09 13:28 |只看该作者

回复 #4 c/unix 的帖子

我觉得用指针参数传递好一点:
void screenCenter( int width, int height, int * wh)
{
...
}
当然是看具体应用了。

论坛徽章:
0
7 [报告]
发表于 2009-02-09 13:30 |只看该作者
function returns address of local variable
returns 的这个 local variable是什么?address
这个address里面呢?int wh[2]
int wh[2]的内容呢?栈里面
栈...
returns 栈里面那两个连续int 的第一个int的地址

论坛徽章:
5
未羊
日期:2014-08-07 15:42:10双子座
日期:2014-09-23 15:42:172015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:282022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32
8 [报告]
发表于 2009-02-09 13:34 |只看该作者
人多智慧大!不错!谢谢大家!

论坛徽章:
0
9 [报告]
发表于 2009-02-09 13:42 |只看该作者
int *screenCenter( int width,int height)
{
     int wh[2];
     int cxScreen, cyScreen ;
     cxScreen = GetSystemMetrics (SM_CXSCREEN) ;
     cyScreen = GetSystemMetrics (SM_CYSCREEN) ;
     //int width=800,height=600;
     wh[0]=cxScreen/2-width/2;
     wh[1]=cyScreen/2-height/2;
     return wh;
      
}

int wh[2]是个局部变量,它的空间是在堆栈中分配的
当你从这个函数返回以后,这段空间里的内容很有可能不再是你想要的了

论坛徽章:
0
10 [报告]
发表于 2009-02-10 06:31 |只看该作者
觉得还是把wh提出去到函数外面,做参数传进来比较好。

如果函数调用的层数太多,那就想想框架。原则上函数调用不要超过3层最好。

刚好看到有个帖子问到C框架的事情。好像和我说的框架不太一样,呵呵。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP