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++ 文件?