考虑一个C结构:
struct T { int x; int y; };
字符串当它被部分初始化时,如
struct T t = {42};
型t.y是否保证为0,或者这是编译器的实现决定?
t.y
8i9zcol21#
如果它是部分初始化的,它保证为0,就像数组初始化器一样。如果它未初始化,它将是未知的。
struct T t; // t.x, t.y will NOT be initialized to 0 (not guaranteed to) struct T t = {42}; // t.y will be initialized to 0.
字符串类似地:
int x[10]; // Won't be initialized. int x[10] = {1}; // initialized to {1,0,0,...}
型样品:
// a.c struct T { int x, y }; extern void f(void*); void partialInitialization() { struct T t = {42}; f(&t); } void noInitialization() { struct T t; f(&t); } // Compile with: gcc -O2 -S a.c // a.s: ; ... partialInitialzation: ; ... ; movl $0, -4(%ebp) ;;;; initializes t.y to 0. ; movl $42, -8(%ebp) ; ... noInitialization: ; ... ; Nothing related to initialization. It just allocates memory on stack.
型
eyh26e7m2#
标准草案8.5.1.7项:-7-如果列表中的初始化器少于集合中的成员,则每个未显式初始化的成员将被默认初始化(dcl.init)。[示例:
struct S { int a; char* b; int c; }; S ss = { 1, "asdf" };
字符串用1初始化ss.a,用“asdf”初始化ss.B,用int()形式的表达式的值初始化ss. c,即0。]
z9zf31ra3#
不,它保证为0。
3b6akqbq4#
除了上面的优秀答案,我还发现(至少在GCC中)你可以通过使用{}来“部分初始化”一个结构体,而不显式地分配任何成员:
{}
#include <stdio.h> struct a { int x; int y; }; int main() { struct a a = {}; printf ("{.x=%d, .y=%d}\n", a.x, a.y); return 0; }
字符串这将输出:{.x=0, .y=0}的值。
{.x=0, .y=0}
4条答案
按热度按时间8i9zcol21#
如果它是部分初始化的,它保证为0,就像数组初始化器一样。如果它未初始化,它将是未知的。
字符串
类似地:
型
样品:
型
eyh26e7m2#
标准草案8.5.1.7项:
-7-如果列表中的初始化器少于集合中的成员,则每个未显式初始化的成员将被默认初始化(dcl.init)。[示例:
字符串
用1初始化ss.a,用“asdf”初始化ss.B,用int()形式的表达式的值初始化ss. c,即0。]
z9zf31ra3#
不,它保证为0。
3b6akqbq4#
除了上面的优秀答案,我还发现(至少在GCC中)你可以通过使用
{}
来“部分初始化”一个结构体,而不显式地分配任何成员:字符串
这将输出:
{.x=0, .y=0}
的值。