gpt4 book ai didi

c - 静态变量未初始化为零

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:08 25 4
gpt4 key购买 nike

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

我正在尝试定义一个 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;
}

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

如果我修改代码以在变量初始化后将 FALSE 分配给 once:

once = FALSE;

内存位置更改为包含 0x00。然后,如果我退出这个调试 session ,然后重新修改代码以删除这行代码并开始一个新的调试 session ,我发现内存位置 0x80 又变成了 0x14在运行应用程序之前。

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

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

UPDATE-2

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

最佳答案

如果您阅读 this storage duration reference你会看到静态存储持续时间

the value stored in the object is initialized only once, prior to main function

所以你必须让在main之前运行的启动代码先运行。一旦 main 函数被调用,值应该已经被初始化。

关于c - 静态变量未初始化为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57060802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com