这些C外部定义之间有什么区别?

Joe*_*ker 3 c arrays extern avr-gcc

我在调试AVR微控制器时遇到了这个问题:我有一个带有大量变量定义的main.c文件,其中有一个结构数组,如下所示:

struct mystruct mystruct_array[COUNT];
Run Code Online (Sandbox Code Playgroud)

在另一个.c文件中,我将此数组称为外部,但是我放弃了数组括号和大小,所以我不会重复自己,只是将变量声明为指针(因为数组本质上是指针,不是吗?) :

extern struct mystruct *mystruct_array;
Run Code Online (Sandbox Code Playgroud)

但是,当我检查使用数组的地址printf("%p\n", mystruct_array);得到了一个空指针,而不是在存储阵列的位置.另外,如果我将访问后续项目数组中,喜欢printf("%p\n", &(mystruct_array[n]));将打印地址0加nsizeof(struct mystruct).

只有在我将定义更改为

extern struct mystruct mystruct_array[COUNT];
Run Code Online (Sandbox Code Playgroud)

(与main.c完全相同),我得到了数组的真实地址.

我的问题:为什么这会对编译器产生影响(在我的例子中是avr-gcc)?

tux*_*ux3 8

那是一个有趣的.

当你写:

struct mystruct mystruct_array[COUNT];
Run Code Online (Sandbox Code Playgroud)

你创建了一个全局的mystruct结构数组,有COUNT它们,并且由于你没有初始化它,它将被填充为零.

当你写下:

extern struct mystruct *mystruct_array;
Run Code Online (Sandbox Code Playgroud)

你告诉编译器有一个名为mystruct_arraysomewhere 的变量,它是一个指针.但它不是,它是一个阵列.因此编译器将读取数组的内容,就好像它是一个指针一样.

因此,当您尝试输出该指针的值时,编译器会mystruct_array在内存中获取并输出其内容,就像它是一个指针一样.因为它实际上是一个充满零的数组,所以你在输出中看到一个空指针.

相反,你应该写一些像:

extern struct mystruct mystruct_array[];
Run Code Online (Sandbox Code Playgroud)

因此编译器知道变量的正确类型.您可以在此处的方括号中指定长度,但您不必这样做.

我建议你仔细阅读指针和数组之间的差异,以确保将来不要混淆它们.