【发布时间】:2014-03-25 05:06:19
【问题描述】:
我记得一个例子,其中演示了指针和数组之间的区别。
当作为函数参数传递时,数组衰减为指向数组中第一个元素的指针,但它们并不等价,如下所示:
//file file1.c
int a[2] = {800, 801};
int b[2] = {100, 101};
//file file2.c
extern int a[2];
// here b is declared as pointer,
// although the external unit defines it as an array
extern int *b;
int main() {
int x1, x2;
x1 = a[1]; // ok
x2 = b[1]; // crash at runtime
return 0;
}
链接器不对外部变量进行类型检查,因此在编译时不会产生错误。问题是 b 实际上是一个数组,但是编译单元 file2 没有意识到这一点,并将 b 视为指针,导致尝试取消引用时崩溃。
我记得当时解释得很有道理,但现在我不记得解释了,我也不能自己想出来。
所以我想问题是在访问元素时,数组与指针的处理方式有何不同? (因为我认为p[1] 被转换为(相当于)*(p + 1) 的程序集,无论p 是一个数组还是一个指针——我显然错了)。
两次解引用(VS 2013)生成的程序集:
注意:1158000h和1158008h分别是a和b的内存地址
12: x1 = a[1];
0115139E mov eax,4
011513A3 shl eax,0
011513A6 mov ecx,dword ptr [eax+1158000h]
011513AC mov dword ptr [x1],ecx
13: x2 = b[1];
011513AF mov eax,4
011513B4 shl eax,0
011513B7 mov ecx,dword ptr ds:[1158008h]
011513BD mov edx,dword ptr [ecx+eax]
011513C0 mov dword ptr [x2],edx
【问题讨论】:
-
我可以解释所有细节,但我不能做得比这更好。查看第 96 页 books.google.com.au/…
标签: c arrays pointers dereference