C语言之不小心踩了指针和内存地址对齐的坑

您所在的位置:网站首页 c语言中如何强制转换类型 C语言之不小心踩了指针和内存地址对齐的坑

C语言之不小心踩了指针和内存地址对齐的坑

2023-04-22 22:36| 来源: 网络整理| 查看: 265

前言

指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量。

本质还是一个变量,指针提供了一种对存储位置的动态访问手段,(相对于普通变量而言,普通变量只能访问自己所占的存储位置)

内存地址对齐,是计算机在内存中的数据排列、访问数据的方式,包含了基本数据对齐和结构体数据对齐的两种相互独立又相互关联的部分。

现代计算机在内存中读写数据是按字节块进行操作,理论上任意类型的变量访问可以从任何地址开始,但是计算机系统对任意数据类型在内存中存放位置有限,它会要求这些数据的首地址的值为K(4位或者8位)的整数倍。

如何踩坑的?

在一份十分优秀的代码中,指针的使用率占比很高,因为指针能让代码实现变得更自由、更高效和更方便等诸多优点,可对于不十分熟悉指针的朋友来说,用起来也许就是灾难(常见的就是程序跑飞)

因此,通过指针的使用率大概就能判断一个人的编程能力水平

请看下面的代码,运行结果是怎么样的呢?

// 假设数组首地址为 0x00004000,符合内存对齐:4的倍数static unsigned char sg_arrBuf[100]; int main(){ memset(sg_arrBuf, 0, sizeof(sg_arrBuf)); // 地址为 0x00004000 uint8_t *pucVal = (uint8_t *)&sg_arrBuf[0]; // 地址为 0x00004001 uint16_t *puiVal = (uint16_t *)&sg_arrBuf[1]; *pucVal = 20; // HEX: 0x14 *puiVal = 2000; // HEX: 0x07d0 printf("HEX: "); for (int i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3