当前位置: 首页 > news >正文

对于memset(b, 1, sizeof b)赋值为16843009情况

memset(b, 1, sizeof b); 的行为看起来可能不符合预期,这是因为 memset 的工作方式和数据类型之间的差异导致的。下面详细解释这个问题。


1. memset 的作用

memset 是 C/C++ 中的一个标准库函数,用于将一段内存区域的值设置为指定的字节值。它的函数原型如下:

void* memset(void* ptr, int value, size_t num);
  • ptr:指向要填充的内存区域的指针。
  • value:要设置的值(以 int 形式传递,但实际是按字节填充)。
  • num:要填充的字节数。

2. memset(b, 1, sizeof b); 的问题

假设 b 是一个数组或结构体,memset(b, 1, sizeof b); 的行为如下:

  • value 参数是 1

    • memset 会将 b 的每一个字节(byte)设置为 1
    • 注意:1 是一个字节值,而不是整数 1
  • sizeof b

    • 这是 b 的总字节大小。

3. 为什么会出现“乱赋值”?

假设 b 是一个 int 数组,例如:

int b[10];
memset(b, 1, sizeof b);
  • int 类型的存储方式

    • 在大多数系统中,int 类型占 4 个字节。
    • 例如,int 值为 1 的二进制表示为:00000000 00000000 00000000 00000001
  • memset 的行为

    • memset 会将 b 的每一个字节设置为 1,而不是将每个 int 设置为 1
    • 因此,每个 int 的 4 个字节都会被设置为 1,即 00000001 00000001 00000001 00000001
    • 这个二进制值对应的十进制数是 16843009(即 0x01010101)。
  • 结果

    • 数组 b 中的每个 int 元素都会被设置为 16843009,而不是 1

4. 示例代码

#include <iostream>
#include <cstring>

int main() {
    int b[10];
    memset(b, 1, sizeof b);

    for (int i = 0; i < 10; i++) {
        std::cout << "b[" << i << "] = " << b[i] << std::endl;
    }

    return 0;
}

输出

b[0] = 16843009
b[1] = 16843009
b[2] = 16843009
...
b[9] = 16843009

5. 如何正确初始化数组?

如果你希望将数组 b 的每个元素初始化为 1,应该使用以下方法:

方法 1:循环赋值
for (int i = 0; i < 10; i++) {
    b[i] = 1;
}
方法 2:使用 std::fill(C++)
#include <algorithm>
std::fill(b, b + 10, 1);
方法 3:初始化列表(C++11 及以上)
int b[10] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};

6. memset 的适用场景

memset 通常用于以下场景:

  • 将内存区域设置为 0(例如初始化数组或结构体)。
  • 将内存区域设置为特定的字节值(例如 0xFF0x00)。

例如:

int b[10];
memset(b, 0, sizeof b); // 将 b 的所有字节设置为 0

总结

  • memset(b, 1, sizeof b); 会将 b 的每个字节设置为 1,而不是将每个元素设置为 1
  • 对于非字节类型(如 intfloat 等),memset 的行为可能会导致意外的结果。
  • 如果需要初始化数组或结构体,建议使用循环赋值、std::fill 或初始化列表。

相关文章:

  • Ansys 2024 R1 安装出现错误码-8544解决方法
  • SPACE_GAME
  • Qt-搭建开发环境
  • 【新能源汽车“心脏”赋能:三电系统研发、测试与应用匹配的恒压恒流源技术秘籍】
  • TF中 Arg 节点
  • 【canvas】一键自动布局:如何让流程图节点自动找到最佳位置
  • 【错误解决】ollama使用huggingface拉取模型异常
  • 第七章-PHP字符串操作
  • 精准git动图拆解​
  • 【NTP系列】chrony同步原理
  • java版鸿鹄招采系统源码 招投标系统源码 供应商招投标平台源码
  • 使用Mybatis 连接数据库 项目示例
  • 图解LLM智能体(LLM Agents):构建与运作机制的全面解析
  • 网络编程——套接字、创建服务器、创建客户端
  • PyQt基础——简单闹钟ui实现(图形化界面、定时器事件)
  • CH347使用笔记:CH347结合STM32CubeIDE实现单片机下载与调试
  • [Banana Pi BPI-R4] RDK 和联发科推出Wi-Fi 7 宽带 CPE 的新硬件参考平台
  • 大语言模型中的 Function Calling
  • Oracle ASM Failgroup故障组
  • vulhub-Billu-b0x攻略
  • 王毅同印度国家安全顾问多瓦尔通电话
  • 国家统计局:4月份居民消费价格同比下降0.1%
  • 视频丨习近平同普京在主观礼台出席红场阅兵式
  • 山东14家城商行中,仅剩枣庄银行年营业收入不足10亿
  • 中日有关部门就日本水产品输华问进行第三次谈判,外交部回应
  • 近4小时会谈、3项联合声明、20多份双边合作文本,中俄元首今年首次面对面会晤成果颇丰