arrays - 对数组元素的地址进行减法运算时出现意外结果
问题描述
我在基于 x32 的处理器上,其中char = 1 byte, short = 2 bytes and int = 4 bytes
.
char
当我创建一个包含元素的类型数组时20
,我希望看到分配给该数组的 20 个内存空间,其地址仅1 byte
因数组的类型而不同。
如果我从数组中取出两个连续的元素并减去它们的地址,那么1
在这种情况下我不应该得到吗?
对于类型为short
and的数组int
,我期望得到2
and 4
。这是因为short
andint
元素需要在内存中对齐。short elements
将在偶数地址(差异 2)上,int elements
并将在可被 4 整除的地址上。
但是,当我运行以下代码时,我得到1,1,1
而不是1,2,4
怎么办?
我怀疑在指针算术方面我遗漏了一些关键细节。
char vecc[20];
printf("%i\n", &vecc[1]-&vecc[0]);
short vecs[20];
printf("%i\n", &vecs[1]-&vecs[0]);
int veci[20];
printf("%i\n", &veci[1]-&veci[0]);
解决方案
指针减法产生的结果是索引的差异,而不是地址之间间隙的大小。
引用C11
,第 6.5.6 章,(强调我的)
当两个指针相减时,两者都应指向同一个数组对象的元素,或者指向数组对象的最后一个元素;结果是两个数组元素的下标之差。[...]
推荐阅读
- c++ - 如何从输入字符串制作二维向量?
- python - 如何使用 sqlalchemy 避免全局变量
- graphql - 无法读取未定义的属性“授权”
- javascript - 具有 Google Apps 脚本值的服务器端和客户端通信函数
- reactjs - Razorpay 说尝试创建实例时没有传递密钥
- three.js - 在 Three.js 中连接两个组件
- python - 如何调用名称仅在python中的变量中知道的函数?
- assembly - 程序集:错误 [66]:段太长(最大值为 ffff)
- python - Python 将列表中的每个数字视为一个单独的数字
- javascript - 每次循环打印一个数字