【发布时间】:2020-08-26 09:34:14
【问题描述】:
我很好奇C18标准中的一句话:
当且仅当两个指针都是空指针时,两个指针比较相等 是指向同一对象的指针(包括指向对象的指针和 开头的子对象)或函数,两者都是指向一个的指针 超过同一个数组对象的最后一个元素,或者一个是指向 一个超过一个数组对象的末尾,另一个是指向 立即发生的不同数组对象的开始 跟随地址空间中的第一个数组对象。 § 6.5.9 6
为什么数组后面的对象必须是另一个数组?不能简单地成为与数组基类型相同类型的对象(例如紧跟在int[] 之后的int)?
难怪我试过这段代码:
#include <stdio.h>
struct test { int arr[10]; int i; };
int main() {
struct test t;
int *p, *q;
p = t.arr + 10;
q = &t.i;
if (p == q)
printf("Equal pointers.");
return 0;
}
它产生相等的指针。这种行为是否根本无法保证,只是实现定义的巧合?
【问题讨论】:
-
我不认为在这里指定数组排除了它是单个对象的可能性。单个 int 也可以视为大小为 1 的数组!
-
该标准还包括以下潜台词:“两个对象可以在内存中相邻,因为它们是较大数组的相邻元素或结构的相邻成员,它们之间没有填充,或者因为实现选择即使它们不相关,也要如此放置它们。”