In 答案之一 https://codegolf.stackexchange.com/a/5163/38214 in C 语言打高尔夫球的技巧 https://codegolf.stackexchange.com/q/2203/38214,我看到了这段代码(非高尔夫版本):
s[],t;
main(c){
for(scanf("%*d "); ~(c=getchar()); s[t++]=c)
putchar(s[t]);
}
我认为上面的程序展示了 UB(但是谁在乎代码高尔夫呢?)。但我不明白的是s[]
在全球范围内。我知道当未指定全局变量的类型时,它默认为int
。我创建了一个小程序,它的编译结果令人惊讶:
#include <stdio.h>
int s[];
int main(void)
{
printf("Hello!");
}
尽管它发出一个警告:
prog.c:23:5: warning: array 's' assumed to have one element [enabled by default]
int s[];
^
- What is
s
在上面的程序中?是不是一个int*
或者是其他东西?
- 这在任何地方都有用吗?
What is s
在上面的程序中?它是 int* 还是其他什么?
s
是一个不完整的类型。这就是为什么你不能sizeof
它。正如 @BLUEPIXY 所建议的,它被初始化为零,因为它是在全局范围内声明的,从而进行了“暂定定义”。
int i[];
数组 i 的类型仍然不完整,隐式初始化程序导致它有一个元素,该元素被设置为
程序启动时为零。
Now,
这在任何地方都有用吗?
如果你只是使用它是没有用的s[0]
因为那时你会去s;
直接地。但是,如果您需要一个具有一定大小的数组并且您不关心 UB,那么“没问题”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)