以下代码导致垃圾或访问冲突错误,为什么会这样......?

时间:2011-04-28 10:18:14

标签: c

file1.c

int a[3]={1,39,7}; /* definition */

file2.c

extern int a[]; /* declaration */
b = a[2]; /* correct usage in file2.c */

file3.c

extern int *a; /* another declaration */
c = a[1]; /* a[1] is *(a+1), fails! */

file2中的用法获取a的第3个元素(7),但是 file2中的用法将39解释为地址(假设为32 位整数和地址),导致垃圾或 访问冲突错误为什么会这样......?

1 个答案:

答案 0 :(得分:7)

在C FAQ中查看this answerint *aint a[]不一样!

编辑: 修改后的答案:

  

在一个源文件中,您定义了一个int数组,而在另一个源文件中,您声明了一个指向int的指针。 [...] type-pointer-to-type-T与array-of-type-T不同。

编辑#2:编辑#2: 要了解会发生什么,请查看this answer。相关部件经过修改以适合您的样品:

  

2 [ in file2.c ]是名为a的对象的过去(开头)的两个位置,而文件3中的1 [。 c ]是一个经过a。指向的对象的地方。

所以在file3.c中它认为a是一个指针,它被解除引用。由于它实际上是数组本身,因此会将其取消引用到其他位置,从而导致访问冲突。