C:数组元素引用编译器实现是特定的吗?

C: Is array element referencing compiler implementation specific?

提问人:Randolf 提问时间:9/9/2015 更新时间:9/9/2015 访问量:84

问:

我经常看到以下语法用于 C 数组元素引用:

int someArray[10];
(void*) a = &someArray[x];

这似乎使某些编译器(例如 MinGW)按 sizeof(int) 递增地址,而对于其他编译器(Texas Instruments)则按 sizeof(void*) 递增地址。

将其更改为似乎可以解决这个问题。(void*) a = &(someArray[x])

问题出在哪里? 标准中是否未定义“&”和“[x]”的优先级? 可移植代码的最佳实践是什么?

谢谢! 兰道夫

C 数组 按引用传递

评论

1赞 ouah 9/9/2015
鉴于这是无效的,我怀疑你经常看到这种情况。(void*) a = &someArray[x];
0赞 Randolf 9/9/2015
对,对不起,我试图比喻。我的意思是无效 *a;int someArray[10];a = &someArray[x];或者 someFunction(&someArray[x])
4赞 interjay 9/9/2015
发布一个真实(而非比喻)示例来演示问题。括号不会有什么不同。
2赞 dhke 9/9/2015
有趣的是,gcc 3.x 之前有一个广义的左值扩展。上述内容将被解释为 .幸运的是,gcc 4 及更高版本不再支持。是的,比 .如果编译器以不同的方式执行此操作,则编译器会损坏。(void *)(a = &someArray[x])[]&
0赞 n. m. could be an AI 9/9/2015
请展示您直接观察到的内容(即,这是一个独立的程序,这是它在平台 A 上的输出,这是它在平台 B 上的输出)。

答:

0赞 sqr163 9/9/2015 #1

此代码没有问题:

int someArray[10];
void *a = &someArray[x];

适当的编译器将根据 sizeof(someArray[0]) 递增指针。

也许,你不应该问“如何编写可移植代码”,而应该问如何编写即使使用野生编译器编译也能正常工作的代码......