OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5011|回复: 15

子函数里面,进行for循环赋值,却发现并没有正确赋值,请问是什么原因?

[复制链接]

60

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
金钱
428
注册时间
2014-1-28
在线时间
8 小时
发表于 2015-8-18 13:53:51 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]//此问题的最新更新: //watch窗口只能查看全局变量,Call Stack+locals窗口里面查看局部变量 //不是优化的问题。[/mw_shl_code]

求助:
如下图所示。我在一个Debug()函数里,进行了一个普通的for循环赋值。
但是,实际仿真的时候,却发现并没有正确赋值。
请问这是为什么呢?
后来,我把deb_temp[50]定义为全局变量。
就能正确赋值了,请问这是什么原因?
谢谢。
就想知道一下为什么会这样?
[mw_shl_code=c,true]#include "stdio.h" uint8 rcv_buf[50]; //串口接收缓存区 void Debug(void); //测试函数 void main() { //其他函数略 Debug(); //其他函数略 } void Debug(void) { uint8 deb_temp[50]; for(i=0;i<50;i++) { deb_temp=rcv_buf; } }[/mw_shl_code]


最佳答案

查看完整内容[请看2#楼]

你看一下你的编译优化等级,有的时候会被优化掉,如果想继续深究可以看看执行到赋值时的汇编。 本身 这个deb_temp[50]是个局部变量,数据在栈中,作用域仅仅在这个子函数里,如果你这个子函数已经全部贴出来了,那就是说你的这个局部变量数组仅仅赋值了,没有任何操作,所以编译器会进行优化。你定义为全局变量的时候,数据在静态全局区,有确定的地址,这时编译器不一定会去优化。 其实你可以这样定义在你的数组定义前加个v ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2015-8-18 13:53:52 | 显示全部楼层
你看一下你的编译优化等级,有的时候会被优化掉,如果想继续深究可以看看执行到赋值时的汇编。
本身 这个deb_temp[50]是个局部变量,数据在栈中,作用域仅仅在这个子函数里,如果你这个子函数已经全部贴出来了,那就是说你的这个局部变量数组仅仅赋值了,没有任何操作,所以编译器会进行优化。你定义为全局变量的时候,数据在静态全局区,有确定的地址,这时编译器不一定会去优化。

其实你可以这样定义在你的数组定义前加个volatile,这样编译器就不优化了,看看操作是否正常;还可以把优化等级设置为NONE;这样的话你的数组在运行到这里的时候应该能看到正常的赋值,但是这个数组还是个在栈中的临时变量,出了这个函数就没有意义了。

以上个人观点

void Debug(void)
{
         volatile uint8 deb_temp[50];
 for(i=0;i<50;i++)
  {
               deb_temp=rcv_buf;
          }

}
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

70

主题

6769

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13173
金钱
13173
注册时间
2012-11-26
在线时间
3818 小时
发表于 2015-8-18 14:09:58 | 显示全部楼层
局部变量的时候,是什么结果?
学无止境
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2015-8-18 14:27:48 | 显示全部楼层
退出Debug函数之前,应该是有的吧。

调用结束,局部定义的数组空间就释放了。
小小蜗牛
回复

使用道具 举报

60

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
金钱
428
注册时间
2014-1-28
在线时间
8 小时
 楼主| 发表于 2015-8-18 14:32:04 | 显示全部楼层
回复【2楼】jermy_z:
---------------------------------

我仿真,跟踪到for里面,一条一条的进行赋值,最后发现,并没有正确赋值。
后来,百度了一下,把deb_temp[]定义为全局变量。
就能正常了。

我想问问这是什么原因?为什么全局变量可以,而局部变量却不能。
谢谢。
回复

使用道具 举报

70

主题

6769

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13173
金钱
13173
注册时间
2012-11-26
在线时间
3818 小时
发表于 2015-8-18 14:45:44 | 显示全部楼层
回复【4楼】LuoKen:
---------------------------------
理论上不该出现问题,可否截张你debug的图
学无止境
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2015-8-18 14:50:52 | 显示全部楼层
数组名改个猥琐点的试下
小小蜗牛
回复

使用道具 举报

8

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2015-8-1
在线时间
7 小时
发表于 2015-8-18 14:54:10 | 显示全部楼层
如果是在for循环是就没有正确赋值,那就比较诡异了。这个不应该呀。可能的原因是在赋值过程中。还未赋值的 rev_buf 的元素又被其他地方的代码改了。
有软件开发经验,从0硬件基础学习STM32开发。
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2015-8-18 15:49:22 | 显示全部楼层
回复【8楼】ianhom:
---------------------------------
签名赞一个。。。。
小小蜗牛
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2015-6-11
在线时间
313 小时
发表于 2015-8-18 15:58:42 | 显示全部楼层
 你要理解全局变量和局部变量的作用域。
 全局变量定义于静态存储区,在整个函数的运行流程中都有效。
 而局部变量定义于内存堆中,只有函数调用才分配内存,当函数调用结束返回时,这部分内存就完全释放掉了,你的赋值就没有意义。
 
 局部变量在编译如果选择了高优化选项时,MDK是不会为局部变量分配地址的,只有在函数调用时由CPU从内存堆分配,如果你想查看局部变量的赋值,参考下图设置


回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2015-8-18 16:08:50 | 显示全部楼层
回复【9楼】jiutianshenjian:
---------------------------------
我发现,论坛里C语言的问题贴回复是最多最快的
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2015-8-18 16:22:48 | 显示全部楼层
回复【11楼】ianhom:
---------------------------------
C语言大家都懂点嘛,其他都看不懂,想说怕人家笑话啊。
小小蜗牛
回复

使用道具 举报

60

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
金钱
428
注册时间
2014-1-28
在线时间
8 小时
 楼主| 发表于 2015-8-20 09:34:24 | 显示全部楼层
谢谢楼上各位!
谢谢。
回复

使用道具 举报

8

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2014-9-29
在线时间
13 小时
发表于 2015-8-20 21:20:08 | 显示全部楼层
可以用指针就不会存在那个问题了,你试试
回复

使用道具 举报

8

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2014-9-29
在线时间
13 小时
发表于 2015-8-20 21:22:36 | 显示全部楼层
还有就是你是在调用结束时赋值不对,还是正在调用时呢,如果是后者不应该啊,你可以试试把数组初始化为0,如果是前者的话,建议使用全局变量定义。
回复

使用道具 举报

60

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
金钱
428
注册时间
2014-1-28
在线时间
8 小时
 楼主| 发表于 2015-8-25 15:25:25 | 显示全部楼层
回复【8楼】ianhom:
---------------------------------

牛逼啊,哥,果然是编译器优化的问题啊。
谢谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-22 03:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表