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 位整数和地址),导致垃圾或 访问冲突错误为什么会这样......?
答案 0 :(得分:7)
在C FAQ中查看this answer。 int *a
和int a[]
不一样!
编辑: 修改后的答案:
编辑#2:编辑#2: 要了解会发生什么,请查看this answer。相关部件经过修改以适合您的样品:在一个源文件中,您定义了一个int数组,而在另一个源文件中,您声明了一个指向int的指针。 [...] type-pointer-to-type-T与array-of-type-T不同。
2 [ in file2.c ]是名为a的对象的过去(开头)的两个位置,而文件3中的1 [。 c ]是一个经过a。指向的对象的地方。
所以在file3.c中它认为a是一个指针,它被解除引用。由于它实际上是数组本身,因此会将其取消引用到其他位置,从而导致访问冲突。