You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:54:00