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*还是别的什么?
s上面的程序里有什么?它是 int* 还是其他什么?
s是一个不完整的类型。这就是为什么你不能sizeof这样做。正如 @BLUEPIXY 所建议的,它被初始化为零,因为它是在全局范围内声明的,从而进行了“暂定定义”。
int i[];
数组 i 的类型仍然不完整,隐式初始化程序导致它只有一个元素,该元素在程序启动时设置为零。
现在,
这在任何地方都有用吗?
如果你只是使用它,那是毫无用处的,s[0]因为那时你就s;直接使用了。但是,如果您需要一个具有一定大小的数组并且您不关心 UB,那么“没问题”。