Я знаю, что неинициализированные статические переменные хранятся в 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
, где не все элементы массива элементов определены явно. В приведенном выше примере подразумевается, что неинициализированные явно части статического объекта g_table
инициализируются 0
. Это гарантированное/определенное поведение?
Примечание. Мне известно, что существуют вопросы о переполнении стека, касающиеся инициализации статических переменных и значения по умолчанию для неинициализированных статических переменных; Мне не удалось найти существующий вопрос относительно этой «частичной инициализации» (пожалуйста, дайте мне знать, если существует более правильный термин для того, что я описываю).