C++ memset 是不是仅适用于 0 和 -1? [关闭]

Posted

技术标签:

【中文标题】C++ memset 是不是仅适用于 0 和 -1? [关闭]【英文标题】:Does C++ memset only works for 0 and -1? [closed]C++ memset 是否仅适用于 0 和 -1? [关闭] 【发布时间】:2021-07-18 14:54:32 【问题描述】:
int a[2];
memset(a, 3, sizeof(a)); 

当我运行它时,我得到的输出为 0 1。为什么不 3 3

【问题讨论】:

请创建一个minimal reproducible example,但请注意memset 适用于字节(即unsigned char),而不适用于整数。请考虑使用std::fill 在普通的 32/64 位机器上,由此产生的值应该是 50529027 50529027。你是在微控制器上运行它吗? 所提供的代码不应产生任何输出。 【参考方案1】:

C++ memset 是否只适用于 0 和 -1?

它适用于所有字节值。

int a[2];
memset(a, 3, sizeof(a)); 

当我运行它时,我得到的输出为 0 1。

我对此表示怀疑。要么你的系统坏了,要么你犯了一个错误。

为什么不 3 3

因为std::memset 不是这样做的。它将每个字节设置为您提供的值。一个多字节整数,其每个字节的值为 3,但没有值 3。在值 3 中,只有最低有效字节的值为 3,更高有效的字节为 0。

除非您想要一个重复的字节模式,否则std::memset 对您没有用处。如果您只是想为每个元素分配一个值,那么您应该使用std::fill 或其朋友:

std::fill(std::begin(a), std::end(a), 3);

或者只是一个简单的循环:

for(int& i : a)
    i = 3;

0 恰好是在所有系统上保留所有字节宽度的值的唯一字节模式; -1 是另一个,但仅在 2 的补码系统上。在 1 的补码系统上,其他模式的值为 -0。这就是为什么 std::memset 在使用这些值时,并且仅在使用这些值时,偶然表现得与 std::fill 相同。

【讨论】:

以上是关于C++ memset 是不是仅适用于 0 和 -1? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

target_compile_options() 仅适用于 C++ 文件?

target_compile_options() 仅适用于 C++ 文件?

vigenere cipher 的 C++ 函数仅有时有效(适用于某些输入,跳过其他输入)

[WHERE列=值,仅适用于INTEGER值

绑定是不是仅适用于 DependencyProperty?

Druid 和 Superset 的可视化是不是仅适用于时间序列数据?