我只是想确保我对这里发生的事情的解释是正确的.请考虑以下代码片段,这些代码片段在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 ];
Run Code Online (Sandbox Code Playgroud)
现在我知道在C中使用方括号只是以下的别名.
*( ... )
Run Code Online (Sandbox Code Playgroud)
因此,在该别名后,该代码段将转换为以下内容.
int result = *( arr + arr + 2 );
Run Code Online (Sandbox Code Playgroud)
现在,我的解释是指针算术将计算为arr加2的地址乘以整数的大小加上arr的地址.因此,我的结论是arr将指向我没有分配的内存.这将导致结果成为一些垃圾值.
但是,当我用clang和gcc编译时,我收到一个错误,说"数组下标不是整数".为什么会这样,我的解释在哪里出错?
数组下标不是整数.
指针算术仅限于:
您不能添加两个指针值,因为结果没有合理的含义.
你期望arr[ arr + 2 ]做什么?更新:我看到你解决了这个问题; 你希望它引用一些垃圾地址.这种语言会阻止您生成垃圾.不要指望它在所有情况下都这样做.