我知道未初始化的静态变量存储在BSS中,因此可以保证使用所有的0
进行初始化(针对它们各自的数据类型大小)。>>
此外,在C语言中,可以将静态变量定义为编译时常量(仅)。
“部分初始化的”静态变量的定义行为是什么(我不确定这是否是正确的术语),如下所示:
// main.c #include <stdbool.h> #include <stdio.h> static struct Foo { bool f[2][3]; } g_table = { { { true, true, false }, { true } } }; int main( int argc, char* argv[] ) { printf( "%d %d %d\n", g_table.f[0][0], g_table.f[0][1], g_table.f[0][2] ); printf( "%d %d %d\n", g_table.f[1][0], g_table.f[1][1], g_table.f[1][2] ); return 0; }
。
将静态对象$ gcc --version && gcc -g ./main.c && ./a.out gcc (GCC) 9.2.1 20190827 (Red Hat 9.2.1-1) Copyright (C) 2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 1 1 0 1 0 0
通过上面的“部分初始化”,我的意思是指
g_table
的初始化,其中并非明确定义成员数组的所有元素。上面的示例implies
g_table
的未明确初始化的部分初始化为0
。 这是保证/定义的行为吗?注意:我知道存在关于静态变量初始化和未初始化静态变量默认值的堆栈溢出问题;我找不到有关此“部分初始化”的现有问题(请告知我所描述的内容是否存在现有的,更正确的术语)。
我知道未初始化的静态变量存储在BSS中,因此可以保证将其初始化为全0(针对它们各自的数据类型大小)。同样,在C语言中,可以定义静态变量...
所有其余元素都初始化为零(对于算术类型)或空指针(对于指针)。 C 2018 6.7.9 21说: