对于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 或初始化列表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35816.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS逆向案例-HIKVISION-视频监控的前端密码加密分析

免责声明 本文仅为技术研究与渗透测试思路分享,旨在帮助安全从业人员更好地理解相关技术原理和防御措施。任何个人或组织不得利用本文内容从事非法活动或攻击他人系统。 如果任何人因违反法律法规或不当使用本文内容而导致任何法律后果,本文作者概不负责。 请务必遵守法律…

SENT接口

文章目录 前言SENT接口简介物理层数据链路层编码方式帧结构消息格式短串行消息格式增强型串行消息格式 CRC校验和CRC4CRC6 错误检测机制 IP 设计结构框图接口设计上板验证 前言 本文参考标准《SAE J2716_201604》。 SENT接口 简介 SENT&#xff08;Single Edge Nibble Tran…

Qt-搭建开发环境

1.环境搭建 开发工具概述&#xff1a; Qt ⽀持多种开发⼯具&#xff0c;其中⽐较常⽤的开发⼯具有&#xff1a;Qt Creator、Visual Studio、Eclipse. 1.1Qt Creator Qt Creator 是⼀个轻量级的跨平台集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为使⽤ Qt 框架进…

Odoo18 Http鉴权+调用后端接口

最近在调研Odoo18&#xff0c;包括它的前后端原理、源码等。发现官方的开发文档并不十分实用&#xff0c;比如标题这种简单的实用需求&#xff0c;竟然浪费了一点时间&#xff0c;特此记录。 官方文档&#xff1a;External API — Odoo 18.0 documentation 前提&#xff1a;首…

【第13节】windows sdk编程:GDI编程

目录 一、GDI 概述 二、设备环境概念 三、使用 GDI 绘图对象 四、使用 GDI 坐标系统 五、使用GDI绘图 5.1 输出文字 5.2 画点和线 5.3 画矩形框、圆和多边形 5.4 画位图和图标 5.5 双缓冲技术 六、综合代码示例 一、GDI 概述 Windows 应用程序不支持标准输出函数&am…

离开页面取消请求

前言 上一篇文章我们处理了axios的重复请求问题axios重复请求&#xff0c;今天来说一下如何在离开某个页面的时候将正在发送的请求取消掉 开始 基于上一篇的axios封装&#xff0c;当我们在编写某个页面的请求的时候 import request from /request/index;export const test2…

C++输入输出流第一弹:标准输入输出流 详解(带测试代码)

目录 C输入输出流 流的四种状态&#xff08;重点&#xff09; 标准输入输出流 标准输入流 逗号表达式 1. 逗号表达式的基本规则 示例 2. 图片中的代码分析 关键点解析 3. 常见误区 误区 1&#xff1a;逗号表达式等同于逻辑与 && 误区 2&#xff1a;忽略输入…

Z 轴热膨胀系数:PCB 可靠性的关键因素与选材策略

在电子设备小型化与高性能化的趋势下&#xff0c;PCB&#xff08;印刷电路板&#xff09;的可靠性成为决定产品寿命的核心因素。其中&#xff0c;Z 轴热膨胀系数&#xff08;α2/z-CTE&#xff09;作为板材的关键参数&#xff0c;直接影响多层板的层间结合力、焊点稳定性及整体…

【C++】Virtual function and Polymorphism

《C程序设计基础教程》——刘厚泉&#xff0c;李政伟&#xff0c;二零一三年九月版&#xff0c;学习笔记 文章目录 1、多态性的概念2、虚函数的定义2.1、引入虚函数的原因2.2、虚函数的定义与使用2.3、虚函数的限制 3、抽象类3.1、纯虚函数3.2、抽象类 4、应用实例 更多有趣的代…

图解LLM智能体(LLM Agents):构建与运作机制的全面解析

LLM智能体:构建与运作机制 LLM智能体(LLM Agents)正在迅速普及,似乎逐渐取代了我们熟悉的传统对话式LLM。这些令人惊叹的能力并非凭空而来,而是需要多个组件协同工作。 本文包含超过60张定制插图,将深入探讨LLM智能体的领域、其核心组件以及多智能体框架的工作原理。 文…

自动驾驶背后的数学:特征提取中的线性变换与非线性激活

在上一篇博客「自动驾驶背后的数学&#xff1a;从传感器数据到控制指令的函数嵌套」—— 揭秘人工智能中的线性函数、ReLU 与复合函数中&#xff0c;我们初步探讨了自动驾驶技术中从传感器数据到控制指令的函数嵌套流程&#xff0c;其中提到了特征提取模块对传感器数据进行线性…

W80x使用WM IoT SDK 2.X 开发(二)驱动tft屏幕

一、硬件准备 开发板依然是官方送的w803&#xff0c;屏幕我的是2.4寸的ST7789 二、查看sdk 1、例程 tft的有这4个程序&#xff0c;我这里直接看最简单的polling吧 首先就是创建一个任务&#xff0c;这跟上一篇点亮led创建任务的步骤一样 继续点进去 2、spi初始化 先看初始…

Linux系统编程(四)--进程概念

文章目录 1.基本概念与基本操作1.1 描述进程-PCB1.2 task_struct-PCB的一种1.3 task_struct内容分类1.4 查看进程1.5 通过系统调用获取进程的PID和PPID1.6 PPID&#xff08;Parent Process ID&#xff09;1.7 通过系统调⽤创建进程-fork初识fork创建子进程使用if进行分流 2.进程…

从 0 到 1 掌握鸿蒙 AudioRenderer 音频渲染:我的自学笔记与踩坑实录(API 14)

最近我在研究 HarmonyOS 音频开发。在音视频领域&#xff0c;鸿蒙的 AudioKit 框架提供了 AVPlayer 和 AudioRenderer 两种方案。AVPlayer 适合快速实现播放功能&#xff0c;而 AudioRenderer 允许更底层的音频处理&#xff0c;适合定制化需求。本文将以一个开发者的自学视角&a…

linux 命令 cd

以下是 Linux 中 cd 命令的详细用法总结&#xff0c;涵盖基础操作、快捷方式和常见场景&#xff1a; 1. 命令功能 cd&#xff08;Change Directory&#xff09;用于切换当前工作目录&#xff0c;是 Linux 文件系统操作中最常用的命令之一。 2. 基本语法 cd [选项] [目录路径…

安卓开发调用本地接口以及设置base_url思路

去年接手pad端开发时曾问过其它组的老安卓一个问题&#xff0c;我们的安卓项目本地开发时能否调用本地接口&#xff0c;回答是否定的。也许是由于通用底座加入的限制&#xff0c;也许是因为太忙了&#xff0c;不想给我解释繁琐的解决方案。 那么在个人PC上玩耍总是能够调用本地…

中小型企业大数据平台全栈搭建:Hive+HDFS+YARN+Hue+ZooKeeper+MySQL+Sqoop+Azkaban 保姆级配置指南

目录 背景‌一、环境规划与依赖准备‌1. 服务器规划(3节点集群)2. 系统与依赖‌3. Hadoop生态组件版本与下载路径4. 架构图二、Hadoop(HDFS+YARN)安装与配置‌1. 下载与解压(所有节点)2. HDFS高可用配置3. YARN资源配置‌4. 启动Hadoop集群三、MySQL安装与Hive元数据配置…

003 SpringCloud整合-LogStash安装及ELK日志收集

SpringCloud整合-LogStash安装及ELK日志收集 文章目录 SpringCloud整合-LogStash安装及ELK日志收集1.安装ElasticSearch和kibana2.Docker安装logstash1.拉取docker镜像2.创建外部挂载目录3.拷贝容器内部文件到宿主机4.修改外部挂载文件5.运行docker容器 3.整合kibana1.进入kiba…

《TCP/IP网络编程》学习笔记 | Chapter 19:Windows 平台下线程的使用

《TCP/IP网络编程》学习笔记 | Chapter 19&#xff1a;Windows 平台下线程的使用 《TCP/IP网络编程》学习笔记 | Chapter 19&#xff1a;Windows 平台下线程的使用内核对象内核对象的定义内核对象归操作系统所有 基于 Windows 的线程创建进程与线程的关系Windows 中线程的创建方…

【Git学习笔记】Git分支管理策略及其结构原理分析

【Git学习笔记】Git分支管理策略及其结构原理分析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Git学习笔记 文章目录 【Git学习笔记】Git分支管理策略及其结构原理分析前言一.合并冲突二. 分支管理策略2.1 分支策略2.2 bug分支2.3 删除临…