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

Spi*_*rix 5 c arrays int global-variables

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

s[],t;

main(c){
    for(scanf("%*d "); ~(c=getchar()); s[t++]=c)
        putchar(s[t]);
}
Run Code Online (Sandbox Code Playgroud)

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

#include <stdio.h>

int s[];
int main(void)
{
    printf("Hello!");
}
Run Code Online (Sandbox Code Playgroud)

虽然它发出一个警告:

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

edm*_*dmz 1

s上面的程序里有什么?它是 int* 还是其他什么?

s是一个不完整的类型。这就是为什么你不能sizeof这样做。正如 @BLUEPIXY 所建议的,它被初始化为零,因为它是在全局范围内声明的,从而进行了“暂定定义”。

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

现在,

这在任何地方都有用吗?

如果你只是使用它,那是毫无用处的,s[0]因为那时你就s;直接使用了。但是,如果您需要一个具有一定大小的数组并且您不关心 UB,那么“没问题”。