如果我在全局范围内声明一个没有大小的数组,我会得到什么?

在C中打高尔夫球技巧 的答案之一中 ,我看到了这段代码(ungolfed版本):

s[],t; main(c){ for(scanf("%*d "); ~(c=getchar()); s[t++]=c) putchar(s[t]); } 

我认为上面的节目展示了UB(但谁在关心代码高尔夫?)。 但我不明白的是全局范围内的s[] 。 我知道当未指定全局变量的类型时,它默认为int 。 我创建了一个令人惊讶的编译的小程序:

 #include  int s[]; int main(void) { printf("Hello!"); } 

虽然它发出一个警告:

 prog.c:23:5: warning: array 's' assumed to have one element [enabled by default] int s[]; ^ 
  • 上面的程序是什么? 它是int*还是别的什么?
  • 这在任何地方都有用吗?

上面的程序是什么? 它是int *还是别的什么?

s是不完整的类型。 这就是为什么你不能调整它的sizeof 。 正如@BLUEPIXY建议的那样,它初始化为零,因为它在全局范围内声明为“暂定”。

int i[];
数组我仍然有不完整的类型,隐式初始化器使它有一个元素,在程序启动时设置为零。

现在,

这在任何地方都有用吗?

如果你只是使用s[0]那就没用了,因为那时候你会选择s; 直。 但是,如果你需要一个具有一定大小的arrays并且你不关心UB,那就“好吧”。