我在调试 AVR 微 Controller 时遇到了这个问题: 我有一个包含许多变量定义的 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)产生影响?
最佳答案
这很有趣。
当你写的时候:
struct mystruct mystruct_array[COUNT];
您创建了一个 mystruct
结构的全局数组,其中有 COUNT
个,由于您没有对其进行初始化,因此它将被填充为零。
当你写下:
extern struct mystruct *mystruct_array;
您告诉编译器某处有一个名为 mystruct_array
的变量,它是一个指针。但它不是,它是一个数组。因此编译器将读取数组的内容,就好像它是一个指针一样。
因此,当您尝试输出该指针的值时,编译器会在内存中获取 mystruct_array
并将其内容作为指针输出。由于它实际上是一个全为零的数组,因此您会在输出中看到一个空指针。
相反,你应该这样写:
extern struct mystruct mystruct_array[];
因此编译器知道变量的正确类型。您可以在此处的方括号中指定长度,但不是必须的。
我建议您继续阅读 the differences between pointers and arrays以确保您以后不会混淆它们。
关于c - 这些 C 外部定义之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29590170/