首页 > 解决方案 > 对数组元素的地址进行减法运算时出现意外结果

问题描述

我在基于 x32 的处理器上,其中char = 1 byte, short = 2 bytes and int = 4 bytes.

char当我创建一个包含元素的类型数组时20,我希望看到分配给该数组的 20 个内存空间,其地址仅1 byte因数组的类型而不同。

如果我从数组中取出两个连续的元素并减去它们的地址,那么1在这种情况下我不应该得到吗?

对于类型为shortand的数组int,我期望得到2and 4。这是因为shortandint元素需要在内存中对齐。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]);

标签: arrayscpointerssubtraction

解决方案


指针减法产生的结果是索引的差异,而不是地址之间间隙的大小。

引用C11,第 6.5.6 章,(强调我的

当两个指针相减时,两者都应指向同一个数组对象的元素,或者指向数组对象的最后一个元素;结果是两个数组元素的下标之差。[...]


推荐阅读