考虑具有静态存储持续时间和相等的常量初始值设定项的两个对象:
static const int a = 50;
static const int b = 50;
编译器是否有效组合这些&a == &b
?
(对于上下文,我考虑使用静态常量对象来获取唯一地址以用作标记指针值。如果编译器合并这些对象是合法的,并且我对两个这样的对象使用相同的常量值,那么地址可能相等,我不能将它们用作哨兵值。)
答案 0 :(得分:2)
指针必须比较不相等。见C99 6.5.9第6段:
两个指针比较相等,当且仅当两个都是空指针时,两者都是指向同一对象的指针(包括指向对象的指针和在其开头的子对象)或函数,两者都指向超过最后一个元素的指针。相同的数组对象,或者一个是指向一个数组对象末尾的指针,另一个是指向不同数组对象的开头的指针,该数组对象恰好跟随地址空间中的第一个数组对象。
答案 1 :(得分:1)
不,标准禁止这样做。不同的对象必须具有不同的地址。在const char a[]="abc", b[]="abc";
中,a
和b
分配在不同的地址。如果它们是指针,也是如此:在const char *a="abc", *b="abc",
中,and
b`也分配在不同的地址;它们指向的字符串常量可以是单个常量数组,就像它是一个命名对象一样。