当我定义并初始化数组a
时:
如果(&(a[x]) > &(a[y]))
成立,则暗示x > y
是否绝对绝对安全?
我担心一些我不知道的奇怪的异常内存地址。
答案 0 :(得分:5)
是的。如果x>y
,则&a[x] > &a[y]
,如果数组的两个元素都存在,或者a[x]
是数组末尾的一个元素。否则,行为是不确定的。
注意:我看到您的问题是上述答案的反面。反之亦然:如果地址更大,则其索引更大;如果地址是除以整数的元素,则 。通常,编译器会处理此问题,并且&a[x]+1
是&a[x+1]
。编译器将第一个表达式中的+1
转换为元素大小的字节数。
答案 1 :(得分:5)
是的,这是可以保证的。 C standard中有关关系运算符的第6.5.8p5节规定:
比较两个指针时,结果取决于 指向的对象在地址空间中的相对位置。 如果两个指向对象类型的指针都指向同一个对象,或者 都指向同一数组的最后一个元素 对象,它们比较相等。如果指向的对象是 同一聚合对象的成员,指向结构的指针 稍后声明的成员比较大于指向的指针 在结构中较早声明的成员,并指向 下标值较大的数组元素比较大于 指向具有较低下标值的相同数组元素的指针。
指向同一个联合对象的成员的所有指针进行比较 等于。如果表达式P指向数组的元素 对象和表达式Q指向对象的最后一个元素 同一数组对象,指针表达式Q + 1比较大于P 。在所有其他情况下,行为均未定义
因此,即使您有奇怪的内存布局,该语言也可以保证下标较高的数组元素的地址与下标较低的数组元素的地址进行比较。只要数组下标有效,比较就会成立。
答案 2 :(得分:1)
由于(1)a[x]
是*(a+x)
,因此(2)&(a[x]) = a+x
x < y
=> a+x < a+y
=> &(*(a+x)) < &(*(a+y)) // from (2)
=> &(a[x]) < &(a[y]) // from (1)