我只是想确保我对这里发生的事情的解释是正确的。考虑以下在 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 进行编译时,我收到一条错误消息,提示“数组下标不是整数”。为什么会这样?我的解释哪里出错了?