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

标签 c arrays extern avr-gcc

我在调试 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 加 nsizeof(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/

相关文章:

java - 接受多个输入到数组中

javascript - 可以在数组上循环的图像

C++ 全局外部 "C" friend 无法访问命名空间类上的私有(private)成员

c - 在 C 函数中声明外部变量?

c - Fork() 导致打印语句重叠

c++ - 什么是 NULL 值

javascript - 当传递由 Function.prototype.call 生成的函数作为参数时,Array.prototype.map 不是函数

c - 在c中的结构中初始化int类型灵活数组时出错

c - 使用 `const` 中断程序

c - 头文件中的函数是否应该设为 "extern"?