我在调试AVR微控制器时遇到了这个问题: 我有一个main.c文件,其中有许多变量定义,其中包括一个结构体数组,如下所示:
struct mystruct mystruct_array[COUNT];
在另一个 .c 文件中,我将此数组称为外部数组,但我省略了数组括号和大小,这样我就不必重复自己,只需将变量声明为指针(因为数组本质上是指针,对吧?):
extern struct mystruct *mystruct_array;
但是当我使用
printf("%p\n", mystruct_array);
检查数组的地址时,我得到了一个空指针,而不是数组在内存中的位置。如果我访问数组中后续的项,例如printf("%p\n", &(mystruct_array[n]));
,它会打印地址0加上n
倍的sizeof(struct mystruct)
。只有在我将定义更改为:
extern struct mystruct mystruct_array[COUNT];
(和main.c中完全一样),我得到了数组的真正地址。
我的问题是:这对编译器有什么影响(在我的情况下是avr-gcc)?
mystruct_array
。 - gietljohannesextern struct mystruct mystruct_array[];
。当然,避免使用全局变量通常是一个好主意。实际上,extern
声明应该在一个头文件中,该头文件同时包含在main.c
和other.c
文件中。这样可以正确交叉检查类型。另请参见如何在C语言中使用extern
共享源文件之间的变量?。 - Jonathan Leffler