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

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.lryc.cn/news/2396783.html

相关文章:

  • 2 Studying《Effective STL》
  • 深入理解复数加法与乘法:MATLAB演示
  • 【设计模式-3.6】结构型——桥接模式
  • 【前端】性能优化篇
  • 【redis实战篇】第六天
  • 力扣题解654:最大二叉树
  • 手写ArrayList和LinkedList
  • Android bindservice绑定服务,bindServiceAsUser补充
  • [蓝桥杯]交换次数
  • 95套HTML高端大数据可视化大屏源码分享
  • 系统架构设计综合知识与案例分析
  • scale up 不能优化 TCP 聚合性能
  • Python-matplotlib库之核心对象
  • Linux 脚本文件编辑(vim)
  • 学习BI---基本操作---数据集操作
  • 初学大模型部署以及案例应用(windows+wsl+dify+mysql+Ollama+Xinference)
  • AI Agent企业级生产应用全解析
  • RocketMQ 学习
  • 【前端】html2pdf实现用前端下载pdf
  • Redis部署架构详解:原理、场景与最佳实践
  • 前端开发知识体系全景指南
  • C++哈希表:unordered系列容器详解
  • vue-13(延迟加载路由)
  • pom.xml 文件中配置你项目中的外部 jar 包打包方式
  • WordPress通过简码插入bilibili视频
  • ZLG ZCANPro,ECU刷新,bug分享
  • 黑马k8s(十七)
  • 掌握HttpClient技术:从基础到实战(Apache)
  • KEYSIGHT N9320B是德科技N9320B频谱分析仪
  • EXSI通过笔记本wifi上外网配置