C externs别名相同的地址?

srk*_*ing 2 c global-variables standards-compliance

C编译器是否可以假设两个不同的extern全局变量不能别名到同一个地址?

在我的情况下,我有这样的情况:

extern int array_of_int[], array_end;

void some_func(void)
{
    int *t;
    for (t = &array_of_int[0]; t != &array_end; t++)
    {
    ...

通过优化编译生成的二进制文件不会测试

t != &array_end
进入循环之前的条件.编译器的优化是循环必须至少执行一次,因为在开始时t不能立即相等&array_end.

当然,我们发现这很难.显然,一些带有链接器部分的汇编程序hackery导致两个外部程序是相同地址的情况.

谢谢你的建议!

Oli*_*rth 6

简而言之,是的,可以自由地做出这样的假设.extern变量没有什么特别之处.两个变量可能不是彼此的别名.(如果答案有所不同,请考虑随之而来的混乱. extern int a, b可能会互为别名,这会使使用这些变量的任何代码的语义完全疯狂!)

事实上,你在这里依赖于未定义的行为,完全停止.以这种方式比较不相关变量的地址是无效的.