繁体   English   中英

静态变量未初始化为零

[英]Static variable is not initialized to zero

我正在使用STVD IDE和COSMIC编译器在stm8s微控制器上开发嵌入式应用程序。

我正在尝试定义一个static bool变量来使用它只执行一次代码片段。 出乎意料的是,变量once未初始化为FALSE0 虽然我明确地初始化了它。 这是我的代码的片段:

uint32_t crc32_buffer(void)
{
    static bool once = FALSE;
    uint32_t crc = 0;

    if(!once)
    {
        calcTable();
        crc = 10;
        once = TRUE;
    }

    return crc;
}

当我尝试检查物理内存位置时,我发现每次进入新的调试会话后(即使在硬件重启控制器之后)和运行应用程序本身之前,内存地址0x80都具有相同的值0x14

如果我在变量初始化后修改代码以将FALSE赋值为once

once = FALSE;

内存位置更改为包含0x00 然后,如果我退出此调试会话然后重新修改代码以删除此代码行并启动新的调试会话,我会在运行应用程序之前发现内存位置0x80再次为0x14

我不明白什么可以阻止编译器将变量初始化为0 我不明白甚至在运行应用程序之前可以将0x14写入内存位置。

我尝试设置一个断点,如果访问内存位置0x80 (读/写)但应用程序没有停止,直到它到达代码片段中的if语句。

UPDATE-2

正如许多人指出的启动程序,我不使用默认的启动代码。 但是,我正在使用自定义的。 当我使用标准启动代码而不是我使用的自定义代码时,在main()函数开始执行之前将内存位置设置为0 自定义启动代码不是这种情况。 因此,当我定义一个新的static变量并将其显式初始化为FALSE ,这个初始化只会发生在main()之前的启动代码中,对吗?

如果您阅读此存储持续时间参考,您将看到静态存储持续时间

存储在对象中的值仅在main函数之前初始化一次

因此,您必须先在main运行之前运行启动代码。 一旦调用main函数,该值应该已经初始化。

在运行应用程序之前,我发现内存位置0x80再次为0x14。

初始化需要代码; 在执行任何代码之前 ,重置后的内存状态是不确定的。

我尝试设置一个断点,如果访问内存位置0x80(读/写)但应用程序没有停止,直到它到达代码片段中的if语句。

这听起来像初始化就在那里。 变量在那时获得了什么价值? 本地静态可以在首次使用时初始化,而不是在运行时启动时初始化。 在我看来,事实上除了理解静态的语义之外,你根本没有问题。

例如,如果你在static声明本身上放置一个断点并运行它,我希望你会在第一次使用初始化时观察到断点被击中一次,之后在后续的函数调用中不会中断。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM