如果我定义了如下的字符缓冲区
char buffer[20] = "foo";
然后
buffer[0] == 'f';
buffer[1] == 'o';
buffer[2] == 'o';
buffer[3] == 0;
标准对缓冲区[4] 到缓冲区[19] 的说法是什么。它们是否也保证初始化为零?
答案 0 :(得分:8)
保证所有剩余元素初始化为零。
参考:
C ++ 03标准部分6.7.8第21段:
如果括号括起的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符数少于数组中的元素,则剩余的总计应为 隐式初始化与具有静态存储持续时间的对象相同。
答案 1 :(得分:1)
许多编译器会将缓冲区[20]的内容初始化为0.如果用{}
初始化它,尤其如此。您可以使用以下内容检查编译器的行为:
#include <stdio.h>
int main() {
char buf1[20] = "foo";
char buf2[20] = {};
int i;
for(i = 0; i < 21; i++ ) {
printf("%02x ", buf1[i]);
}
printf("\n");
for(i = 0; i < 21; i++ ) {
printf("%02x ", buf2[i]);
}
printf("\n");
}
请注意,我将21放在条件而不是20只是为了将输出推送到实际的缓冲区分配之外。之后它应该转储一些垃圾字节。