为什么我的静态数组没有被 memset 清除?

Why is my static array not cleared by memset?

我想为嵌入式项目提供一个简单的浮点数到字符串转换器,并且不想使用浮点数 snprintf,因为那会填满我的闪存,所以我编写了一个简单的转换函数。我真的不关心确切的小数位数或负值。这只是一个 C++ 示例,我不想使用 STL 或其他 C++ 特定函数,因为在实际项目中我真的受到 space 的限制。

#include <iostream>
#include <cstdio>
#include <cstring>

char msg[100];

typedef uint32_t u32;

char* floatToString(float value)
{
    static char placeholder[100];
    memset(placeholder, '[=10=]', sizeof placeholder);

    auto root = (u32) value;
    auto decimals = (u32) (value * 1000) % 1000;

    snprintf(placeholder, 100, "%lu.%lu", root,
            decimals);

    return placeholder;
}

float weirdVal = 11.35;

int main(){
    snprintf(msg, 100, "%s,%s", floatToString(weirdVal), floatToString(64.876));

    std::cout << msg << '\n';


    return 0;
}

当我测试函数并调用它时,我总是得到第一个通过的数字。我的输出是:

11.350,11.350

您正在为转换后的值使用公共缓冲区。

并且由于评估顺序 在您的系统上 显然首先评估最右边的参数,您只能看到 11.35 的最后一个转换。

您可以通过以下方式解决:

  • 分别打印转换后的值
  • 使用另一种缓冲(动态的,调用者本地的,...)

注意:您需要格式化 "%lu.%03lu" 以获得正确的结果,例如 23.007。