是否已将部分定义的静态对象的未初始化成员确保初始化为0? [重复]

问题描述 投票:1回答:1

我知道未初始化的静态变量存储在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 static-variables variable-initialization
1个回答
3
投票

所有其余元素都初始化为零(对于算术类型)或空指针(对于指针)。 C 2018 6.7.9 21说:

© www.soinside.com 2019 - 2024. All rights reserved.