OpenEdv-开源电子网

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

变量存储类别问题

[复制链接]

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2017-2-21
在线时间
49 小时
发表于 2017-7-12 15:59:01 | 显示全部楼层 |阅读模式
1金钱
int f(void)
{
//        static int b = 0;                //①
//        int b = 0;                        //②
//        int b;                                //③
        b++;
        return b;
}

void main()
{
        Init();
        while(1)
        {
                m = f();
                rs_write(m);
                delay_ms(1000);
        }
}
做了三个测试,程序如上,只有定义变量的方式不同。
①是静态存储付初值0,②是动态存储付初值0,③是动态存储不付初值。
都是局部变量,主函数一直调用,理论上①应该b一直增加,②b每次重置0,③也同②或者b的值可能随机。
但是测试结果,①②同理论,但③的结果与①一样,在不断增加,看书上写的局部动态存储变量应该每次调用完自动释放空间,变量值就会被清楚啊。
有懂的朋友吗,麻烦分析分析。

1.jpg
2.jpg
3.jpg

最佳答案

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

1、严谨的人写程序,申请内存、定义变量时都会初始化(一般清空置0),不管你通过什么方式申请内存,内存上的内容是不确定,很多时候刚好是0,所以不初始化也没关系,或者逻辑上与变量初始值无关系。 2、释放内存,只是释放了内存的使用权利,不是把该内存的地址内容清零(专业解释:此时是脏数据,意想不到的数据!);这跟你删除某个文件是一样的道理,只要没有新内容覆盖,原来文件还可以通过特殊手段获取出来。 3、养成初始 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3447
金钱
3447
注册时间
2017-7-4
在线时间
869 小时
发表于 2017-7-12 15:59:02 | 显示全部楼层
1、严谨的人写程序,申请内存、定义变量时都会初始化(一般清空置0),不管你通过什么方式申请内存,内存上的内容是不确定,很多时候刚好是0,所以不初始化也没关系,或者逻辑上与变量初始值无关系。
2、释放内存,只是释放了内存的使用权利,不是把该内存的地址内容清零(专业解释:此时是脏数据,意想不到的数据!);这跟你删除某个文件是一样的道理,只要没有新内容覆盖,原来文件还可以通过特殊手段获取出来。
3、养成初始化习惯。
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-7-12 16:25:21 | 显示全部楼层
监视一下b的地址试试。我怀疑是b每次都被分配到同一块内存比如B。虽然b被释放了,但是内存B中的值是没变的。下一次b又被分配到B,函数f中又没初始化b,所以程序读B中的值就把上次b++的结果读走去++,结果就是b一直在增加
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2017-2-21
在线时间
49 小时
 楼主| 发表于 2017-7-13 08:50:26 | 显示全部楼层
Owen 发表于 2017-7-12 16:25
监视一下b的地址试试。我怀疑是b每次都被分配到同一块内存比如B。虽然b被释放了,但是内存B中的值是没变的 ...

好的,我试试。测试又发现个问题,上面是51的测试,我换成32测试,结果是int b,每次调用函数,b都被初始为1.怀疑是不同单片机设置不同。我看看地址确认下
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-7-13 15:17:31 | 显示全部楼层
我是路人甲 发表于 2017-7-13 08:50
好的,我试试。测试又发现个问题,上面是51的测试,我换成32测试,结果是int b,每次调用函数,b都被初始 ...

变量的初始化应该是编译器负责的。51和stm32的编译器不同吧可能是
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2017-2-21
在线时间
49 小时
 楼主| 发表于 2017-7-13 17:09:55 | 显示全部楼层
Acuity 发表于 2017-7-13 16:01
1、严谨的人写程序,申请内存、定义变量时都会初始化(一般清空置0),不管你通过什么方式申请内存,内存上 ...

解释得很好,我就是碰到了这个问题所以来问问,以后才能注意到严谨一些
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-12-18 15:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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