顶级的C数组指针没有大小声明

此代码编译并生成我期望的输出。

#include  int* ar[]; int main(void) { ar[0] = 97; ar[1] = 98; ar[2] = 99; printf("%i\n", ar[0]); printf("%i\n", ar[1]); printf("%i\n", ar[2]); printf("%i\n", ar[3]); return 0; } /* output 97 98 99 0 */ 

我有一种感觉,我在很多层面上做错了。 这里有什么不良影响,它们是什么?

此外,为什么指针数组作为全局变量,而如果我在main声明它,gcc会引发错误?

至少有几个问题:

1) ar是一个指针数组 – 你为它分配int(并将元素打印为int)。 我从GCC和MSVC收到有关此事的警告。

2) ar的声明是’不完整类型’,因为它没有指定的大小。 MSVC拒绝链接说它无法解析ar符号,这是我所期望的。 GCC确实链接,提供警告:

 warning: array 'ar' assumed to have one element 

在这种情况下,我更喜欢MSVC行为。

在GCC的情况下,您正在访问3或4个数组元素的数据,实际只存在1个元素,因此您正在访问不正确属于对象的内存,这是未定义的行为。 它会导致内存损坏,崩溃或显然工作 – 即使程序不正确(如在测试中)。

两个词:未定义的行为。 如果它在main中,gcc可以告诉ar没有给出任何空间,因为它的范围仅限于堆栈。 当ar是全局的时,编译器无法确保没有人为它分配空间。 某些系统可能会产生不良影响,而其他系统可能会运行正常。 关键是它不会总是按照您的期望行事,因为它的作用是未定义的。

int * a []是一个指针数组。 它是一个空数组,你没有分配任何空间。 代码的行为是未定义的.gcc提高/不提出错误是您最不担心的问题。

如果你宣布

 int ar[4] 

你会没事的。 在这种情况下,ar是全局的并初始化为4个零。 您在main中设置值然后覆盖0。

但没有维度,没有去。