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

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*还是别的什么

在中,我看到了以下代码(ungolfed版本):

我认为上面的程序展示了UB(但谁在乎代码高尔夫?)。但我不明白的是全球范围内的
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
。但它不是“结构的成员”。你是什么意思,@alk
s
是一个不完整的类型,应该用作灵活的数组成员。其他用途没有意义。我的意思是,由于
s
不是“结构的成员”,因此引用的附录不适用。此外,根据C11草案6.9.2/5(正如@BLUEPIXY已经提到的):由于
s
属于不完整类型,并且在全局范围内,它被隐式初始化为
…={0}
。因此,它以
int[1]
结束,
s[0]
等于
0
。但是,对于“为什么它是不完整类型”的问题,答案是它应该是一个灵活的数组成员。我将更新以澄清。
#include <stdio.h>

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