Alo*_*ave 13

没有.最终结果是将结构成员初始化为0.

C99标准6.7.8.21

如果括号括起的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符数少于数组中的元素,则聚合的其余部分应为隐式初始化与具有静态存储持续时间的对象相同.

您的结构A是一个聚合,上面的规则适用于它.因此,所有结构成员的初始化值都与静态存储持续时间相同.这是0.

C99标准7.21.6.1 memset功能:

void *memset(void *s, int c, size_t n);
Run Code Online (Sandbox Code Playgroud)

memset函数将c(转换为unsigned char)的值复制到n指向的对象的每个第一个字符中s.

简单来说,所有成员(包括结构对象中的对齐/填充位)A都设置为0.

请注意,C中两个构造之间的区别仅在于memset将对齐/填充设置0为,而聚合初始化仅保证将结构成员设置为0.

在任何一种情况下,您都无法通过约定语言结构访问对齐/填充字节,因此两者都可以获得相同的效果.

  • 我说现在是人们在他们的问题上付出最小努力的时候了.至少复制粘贴 - 它不是要求太多. (4认同)
  • @LuchianGrigore:它不是要求太多,而是来自一个名为rep`1的新用户.我不认为期望采取道德制高点并回答问的问题太过分了.我想说甚至可以编辑Q以反映明显的离开OP注意事项下次要小心.令人失望的是,高代表用户通过投入华而不实的热烈答案而不是做任何事情,令人失望,这些答案并不能真正帮助OP,也不会对任何人产生任何影响. (4认同)
  • 这不是要取得制高点,而是要推进一个干净的问题.**特别是**对于1代表的用户.这是教育.而不是"在这里,让我为你解决这个问题,不要让它打扰你",我选择"这是你问题的答案,如果它不是你想要的,请花点时间提出一个好问题". (2认同)
  • 我从来没有试图"掩饰"我的"辱骂" - 我已经非常清楚地表达了这一点,主要是因为它没有任何问题.至少我承认这一点 - 另一方面,你显然认为你不这样做,只是回答这些问题就是你做的充分证据.如果我想提出投票的问题,我向你保证我也可以编辑和回答预期的版本.这不是火箭科学.所以是的,在这种情况下,我确实想要推进一个更清晰的问题.在这种情况下,不是我是谁.;) (2认同)

MOH*_*MED 5

两者都将内存设置为0

第一个用于将静态分配内存设置为0

A a ={0}; // set a staic memory to 0
Run Code Online (Sandbox Code Playgroud)

你不能这样做:

A *a = malloc(sizeof(A)); a = {0} // This could not be done
Run Code Online (Sandbox Code Playgroud)

第二个用于将动态和静态分配内存设置为0

A a;
memset(&a,0,sizeof(A));
Run Code Online (Sandbox Code Playgroud)

你也可以

A *a = malloc(sizeof(A)); memset(a,0,sizeof(A));
Run Code Online (Sandbox Code Playgroud)

另一件事

memset你使用设置内存时0,这里你正在调用一个函数(这需要时间).设置时{0},您不会调用函数.所以{0}可能比...更快memset