变量存储类别问题

2019-08-17 00:42发布

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的值可能随机。
但是测试结果,①②同理论,但③的结果与①一样,在不断增加,看书上写的局部动态存储变量应该每次调用完自动释放空间,变量值就会被清楚啊。
有懂的朋友吗,麻烦分析分析。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
Acuity
1楼-- · 2019-08-17 04:07
 精彩回答 2  元偷偷看……
Owen
2楼-- · 2019-08-17 06:02
监视一下b的地址试试。我怀疑是b每次都被分配到同一块内存比如B。虽然b被释放了,但是内存B中的值是没变的。下一次b又被分配到B,函数f中又没初始化b,所以程序读B中的值就把上次b++的结果读走去++,结果就是b一直在增加
我是路人甲
3楼-- · 2019-08-17 10:07
Owen 发表于 2017-7-12 16:25
监视一下b的地址试试。我怀疑是b每次都被分配到同一块内存比如B。虽然b被释放了,但是内存B中的值是没变的 ...

好的,我试试。测试又发现个问题,上面是51的测试,我换成32测试,结果是int b,每次调用函数,b都被初始为1.怀疑是不同单片机设置不同。我看看地址确认下
Owen
4楼-- · 2019-08-17 13:48
我是路人甲 发表于 2017-7-13 08:50
好的,我试试。测试又发现个问题,上面是51的测试,我换成32测试,结果是int b,每次调用函数,b都被初始 ...

变量的初始化应该是编译器负责的。51和stm32的编译器不同吧可能是
我是路人甲
5楼-- · 2019-08-17 14:03
Acuity 发表于 2017-7-13 16:01
1、严谨的人写程序,申请内存、定义变量时都会初始化(一般清空置0),不管你通过什么方式申请内存,内存上 ...

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

一周热门 更多>