当一个fixed-length char数组用一个短字符串初始化时,剩下的space是怎么初始化的?
When a fixed-length char array is initialized with a short string, how is the remaining space initialized?
char s[10] = "Test";
剩余的字符(在“测试”和终止 null 之后)是如何初始化的? (定义了吗?)
背景
我这样做是为了将自定义 fixed-width(并忽略)header 写入 STL file。但我不想在剩余的 space.
中有 random/uninitialized 个字节
对于并非所有成员都被显式初始化的任何数组(或结构)的一般规则是,其余的被初始化“就好像它们具有静态存储持续时间”。这意味着它们被设置为零。
所以写一些像这样奇怪的东西实际上会很好用:char s[10] = {'T','e','s','t'};
。由于剩余字节设置为零,因此第一个字节将被视为空终止符。
How are the remaining chars (after "Test" and terminating null) initialized? (Is it defined?)
是的,定义明确,在一个用字符串文字初始化并且指定大小大于字符串文字长度的 char 数组中,所有剩余元素都被零初始化。
来自 C++ 标准(tip-of-trunk)字符数组 § 9.4.3 [dcl.init.string]
3. If there are fewer initializers than there are array elements, each element not explicitly initialized shall be zero-initialized ([dcl.init]).
来自cppreference的一些示例:
char a[] = "abc";
// equivalent to char a[4] = {'a', 'b', 'c', '[=10=]'};
// unsigned char b[3] = "abc"; // Error: initializer string too long
unsigned char b[5]{"abc"};
// equivalent to unsigned char b[5] = {'a', 'b', 'c', '[=10=]', '[=10=]'};
wchar_t c[] = {L"кошка"}; // optional braces
// equivalent to wchar_t c[6] = {L'к', L'о', L'ш', L'к', L'а', L'[=10=]'};
char s[10] = "Test";
剩余的字符(在“测试”和终止 null 之后)是如何初始化的? (定义了吗?)
背景
我这样做是为了将自定义 fixed-width(并忽略)header 写入 STL file。但我不想在剩余的 space.
中有 random/uninitialized 个字节对于并非所有成员都被显式初始化的任何数组(或结构)的一般规则是,其余的被初始化“就好像它们具有静态存储持续时间”。这意味着它们被设置为零。
所以写一些像这样奇怪的东西实际上会很好用:char s[10] = {'T','e','s','t'};
。由于剩余字节设置为零,因此第一个字节将被视为空终止符。
How are the remaining chars (after "Test" and terminating null) initialized? (Is it defined?)
是的,定义明确,在一个用字符串文字初始化并且指定大小大于字符串文字长度的 char 数组中,所有剩余元素都被零初始化。
来自 C++ 标准(tip-of-trunk)字符数组 § 9.4.3 [dcl.init.string]
3. If there are fewer initializers than there are array elements, each element not explicitly initialized shall be zero-initialized ([dcl.init]).
来自cppreference的一些示例:
char a[] = "abc"; // equivalent to char a[4] = {'a', 'b', 'c', '[=10=]'}; // unsigned char b[3] = "abc"; // Error: initializer string too long unsigned char b[5]{"abc"}; // equivalent to unsigned char b[5] = {'a', 'b', 'c', '[=10=]', '[=10=]'}; wchar_t c[] = {L"кошка"}; // optional braces // equivalent to wchar_t c[6] = {L'к', L'о', L'ш', L'к', L'а', L'[=10=]'};