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

C语言——获取变量所在地址(uint8和uint32的区别)

前言:

1.使用uint8 *的原因

在C语言中,获取或操作一个4字节地址(指针)时使用uint8_t*(即unsigned char*)而不是uint32_t*,主要基于以下关键原因:

1.1. 避免违反严格别名规则(Strict Aliasing)

C语言的严格别名规则规定:不同类型的指针不能互相访问同一内存区域(例外:char和void可别名任何类型)。
如果使用uint32_t访问其他类型的数据(如结构体、浮点数等),属于未定义行为(UB)。
uint8_t
(本质是unsigned char*)是特例,允许安全访问任何对象的底层字节表示。

1.2.确保正确的字节级操作

地址操作通常需要逐字节处理(如复制内存、序列化、硬件寄存器访问)。

uint8_t*以单字节为步长移动,确保精确控制每个字节:

uint8_t *byte_ptr = (uint8_t*)address;
byte_ptr[0] = 0x12; // 操作第1字节
byte_ptr[1] = 0x34; // 操作第2字节
...

uint32_t*以4字节为步长,直接操作整个字,无法精细控制单个字节。

1.3.规避对齐问题(Alignment)

uint32_t要求地址按4字节对齐(如地址必须是4的倍数)。未对齐访问在部分架构(如ARM)会触发硬件异常。
uint8_t
无对齐限制,可安全访问任意地址(如从0x1001开始)。

1.4.兼容不同架构的指针大小

地址(指针)的大小不一定是4字节:
32位系统:指针为4字节。
64位系统:指针为8字节。
使用uint32_t在64位系统会截断地址(丢失高4字节),而uint8_t作为指针类型本身可自动适应架构。

错误示例:为何避免uint32_t*

float data = 3.14f;
uint32_t *u32_ptr = (uint32_t*)&data; // 危险!违反严格别名规则
*u32_ptr = 0x12345678;                // 未定义行为(UB)// 正确做法:用uint8_t*逐字节访问
uint8_t *byte_ptr = (uint8_t*)&data;
for (int i = 0; i < sizeof(data); i++) {printf("%02X ", byte_ptr[i]); // 安全输出每个字节
}

2.何时使用uint32_t*?

仅当明确知道目标内存是uint32_t类型且地址已对齐时:

uint32_t value = 0x12345678;
uint32_t *ptr = &value; // 合法:类型匹配且自然对齐

3.总结

场景推荐类型原因
操作地址的底层字节uint8_t*安全别名、无对齐限制、逐字节访问
操作已知的32位整数uint32_t*直接访问整个字(需确保类型匹配和对齐)
存储指针的数值uintptr_t平台无关的整数类型,可安全保存指针值(如uintptr_t addr = (uintptr_t)ptr;)

关键点:地址操作的本质是字节级访问,uint8_t*是C标准中唯一被允许无风险操作任意内存的指针类型。

http://www.xdnf.cn/news/715033.html

相关文章:

  • 【Linux网络篇】:初步理解应用层协议以及何为序列化和反序列化
  • Go语言中flag包的用法详解
  • 23、Swift框架微调实战(3)-Qwen2.5-VL-7B LORA微调OCR数据集
  • 计算机视觉---YOLOv4
  • jdk 国内下载镜像站
  • 数据结构 -- 判断正误
  • 微信小程序学习目录
  • 《合同管理系统业务设计》系列三:合同创建与起草流程
  • Cursor系列(1):Cursor安装、虚拟环境
  • 每日算法-250529
  • 【深度学习】13. 图神经网络GCN,Spatial Approach, Spectral Approach
  • 【C语言练习】071. 理解C语言中的信号处理
  • 华为OD机试真题——求最多可以派出多少支队伍(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • Android高级开发第一篇 - JNI(初级入门篇)
  • function reorder in binary
  • 支持selenium的chrome driver更新到137.0.7151.55
  • 如何选择适合团队的项目管理工具
  • 替代ADS1299的LH7909芯片应用方案
  • Linux系统文件描述符限制配置指南
  • DNS缓存
  • 路由器、网关和光猫三种设备有啥区别?
  • springboot面试题
  • meilisearch docker 简单安装
  • 基于Docker和YARN的大数据环境部署实践最新版
  • kafka 常用知识点
  • 4. Qt对话框(2)
  • [网页五子棋][匹配模块]用户管理器可能存在的问题以及解决办法(线程安全、多开问题)
  • Leetcode 2921. 价格递增的最大利润三元组 II
  • 知识课堂|sCMOS相机可编程快门模式解析
  • 2.2 在javaweb开发中常见后缀文件名的简单理解