2

我只是想确保我对这里发生的事情的解释是正确的。考虑以下在 32 位环境中编译并在堆栈上声明的代码片段。

// Declares an array of integers with a length of 10.
int arr[ 10 ] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

// Performs some pointer arithmetic.
int result = arr[ arr + 2 ];

现在我知道在 C 中使用方括号只是以下内容的别名。

*( ... )

因此,在该别名之后,该片段将转换为以下内容。

int result = *( arr + arr + 2 );

现在,我的解释是指针运算将计算为 arr 的地址加上 2 乘以整数的大小,再加上 arr 的地址。因此,我的结论是 arr 将指向我尚未分配的内存。这将导致结果是一些垃圾值。

但是,当我同时使用 clang 和 gcc 进行编译时,我收到一条错误消息,提示“数组下标不是整数”。为什么会这样?我的解释哪里出错了?

4

2 回答 2

8

数组下标不是整数。

指针运算限于:

  • 指针 - 指针(产生一个整数)
  • 指针 + 整数(产生一个指针)
  • 指针 - 整数(产生一个指针)。

您不能添加两个指针值,仅仅因为结果没有合理的含义。

你期望arr[ arr + 2 ]做什么?更新:我看到你解决了这个问题;您希望它引用一些垃圾地址。这是语言阻止您生成垃圾的情况。不要指望它在所有情况下都这样做。

于 2013-08-08T19:20:22.593 回答
0

除了一个字母,您的代码应该可以工作!![] 中的值需要是整数,因此取消引用 arr+2 :

// Declares an array of integers with a length of 10.
int arr[ 10 ] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

// Performs some pointer arithmetic.
int result = arr[ *(arr + 2) ];

这应该产生结果 = arr[2]; 因此结果 = 2

我在 Eclipse/Microsoft C 编译器上运行它并得到了完全一致的结果。

最后,arr + 2在 K&R 中讨论了 的约定,您尝试做的事情绝对没有错。

只是为了好玩尝试:int result = *(arr + *(arr + 2));

于 2013-08-09T01:33:53.813 回答