C 如果在全局范围内声明一个没有大小的数组,会得到什么?
在中,我看到了以下代码(ungolfed版本): 我认为上面的程序展示了UB(但谁在乎代码高尔夫?)。但我不明白的是全球范围内的C 如果在全局范围内声明一个没有大小的数组,会得到什么?,c,arrays,int,global-variables,C,Arrays,Int,Global Variables,在中,我看到了以下代码(ungolfed版本): 我认为上面的程序展示了UB(但谁在乎代码高尔夫?)。但我不明白的是全球范围内的s[]。我知道当没有指定全局变量的类型时,它默认为int。我创建了一个小程序,它惊人地编译: #include <stdio.h> int s[]; int main(void) { printf("Hello!"); } 上述程序中的s是什么?它是一个int*还是别的什么 这在任何地方都有用吗 上述程序中的s是什么?是int*还是别的什么
s[]
。我知道当没有指定全局变量的类型时,它默认为int
。我创建了一个小程序,它惊人地编译:
#include <stdio.h>
int s[];
int main(void)
{
printf("Hello!");
}
- 上述程序中的
是什么?它是一个s
还是别的什么int*
- 这在任何地方都有用吗
s
是什么?是int*还是别的什么
s
是不完整的类型。这就是为什么您不能sizeof
it。正如@BLUEPIXY所建议的,它是用零初始化的,因为它是在全局范围内声明的,并生成了一个“暂定定义”
inti[]代码>
数组i的类型仍然不完整,隐式初始化器会使它有一个元素,该元素设置为
程序启动时为零
现在,
这在任何地方都有用吗
如果你只是使用s[0]
,这是非常无用的,因为在这一点上你选择s代码>直接。但是,如果您需要一个具有特定大小的数组,并且您不关心UBs,那么“没问题”。gcc假定s[]
为s[1]
。对于sizeof s
,gcc返回4
。参见6.9.2外部对象定义,隐式初始化器!为什么不回答这个问题呢@BLUEPIXY@alk,“gcc为s的大小返回4
”--您是如何测试的?它给了我一个错误(见我之前的评论),我用符号编译,在a.out
上运行gdb,在b main
,r
上运行,然后键入p sizeof s
。但它不是“结构的成员”。你是什么意思,@alks
是一个不完整的类型,应该用作灵活的数组成员。其他用途没有意义。我的意思是,由于s
不是“结构的成员”,因此引用的附录不适用。此外,根据C11草案6.9.2/5(正如@BLUEPIXY已经提到的):由于s
属于不完整类型,并且在全局范围内,它被隐式初始化为…={0}
。因此,它以int[1]
结束,s[0]
等于0
。但是,对于“为什么它是不完整类型”的问题,答案是它应该是一个灵活的数组成员。我将更新以澄清。
#include <stdio.h>
int s[];
int main(void)
{
printf("Hello!");
}