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

时间:2010-11-17 18:49:49

标签: c pointers

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

#include <stdio.h>

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会引发错误?

4 个答案:

答案 0 :(得分:4)

至少有几个问题:

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

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

warning: array 'ar' assumed to have one element

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果您声明

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

但没有维度,不能去。