【问题标题】:C: Is array element referencing compiler implementation specific?C:引用编译器实现的数组元素是特定的吗?
【发布时间】:2015-12-05 02:57:15
【问题描述】:

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

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

这似乎使用一些编译器(例如 mingw)将地址增加 sizeof(int) 并使用其他编译器(德克萨斯仪器)增加 sizeof(void*)。

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

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

谢谢! 兰道夫

【问题讨论】:

  • 鉴于(void*) a = &someArray[x]; 无效,我怀疑你经常看到这种情况。
  • 对,抱歉,我只是想比喻一下。我的意思是 void *a; int someArray[10]; a = &someArray[x];或 someFunction(&someArray[x])
  • 发布一个真实的(不是比喻的)例子来说明问题。括号不会产生影响。
  • 有趣的是,高达 3.x 的 gcc 有一个 generalized lvalues 扩展名。以上将被解释为(void *)(a = &someArray[x])。幸运的是,gcc 4 及更高版本不再支持。是的,[] 的偏好高于&。如果编译器做的不同,编译器就坏了。
  • 请展示您直接观察到的内容(即这是一个独立的程序,这是它在平台A上的输出,这是它在平台B上的输出)。

标签: c arrays pass-by-reference


【解决方案1】:

这段代码没有问题:

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

正确的编译器会根据 sizeof(someArray[0]) 递增指针。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2011-02-25
    • 2011-03-21
    相关资源
    最近更新 更多