C++用cstring库memset给数组赋值仅0生效其他值异常的原因
memset填充非0值得到异常大整数的原因
核心原因:memset 是按字节填充的内存操作函数
memset函数原型为void *memset(void *dest, int fill_val, size_t byte_count);- 第二个参数
fill_val虽然是int类型,但实际仅会取它的低8位(即1字节的无符号值),逐字节填充到dest指向的前byte_count字节内存中。
为什么填充0时正常?
当fill_val为0时,截取到的低8位是0x00,每个字节都被填充为0。无论数组元素是多少字节的整型(比如4字节int、8字节long),所有字节均为0拼接出来的整数值就是0,完全符合预期。
为什么填充非0值会得到"随机大整数"?
你看到的不是随机值,是多字节拼接后的固定结果。
以常见的32位int数组为例:
调用memset(arr, 1, sizeof(arr))时,每个字节被填充为0x01,一个4字节的int元素的内存内容拼接后为0x01010101,换算为十进制就是16843009,看起来和你预期的1差异极大,所以会误以为是随机大整数。
正确的多字节数组非0填充方案
如果要给int等多字节类型的数组填充指定整数值,不要用memset,可以选择:
- 循环遍历数组逐个元素赋值
- C++中可以使用标准库的
std::fill函数
内容的提问来源于stack exchange,提问作者Vasu saini
相关产品推荐
相关产品推荐

