C++ 字符缓冲区初始化的标准行为
如果我像下面这样定义一个字符缓冲区C++ 字符缓冲区初始化的标准行为,c++,char,C++,Char,如果我像下面这样定义一个字符缓冲区 char buffer[20] = "foo"; 然后 标准对缓冲区[4]到缓冲区[19]有何规定。它们是否也保证被初始化为零?所有剩余元素都保证被初始化为零 参考资料: C++03标准第6.7.8节第21段: 如果大括号内的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组中的元素,则聚合的其余部分应为 与具有静态存储持续时间的对象隐式初始化相同 许多编译器会将缓冲区[20]的内容初始化为0。如果使用{}初始化
char buffer[20] = "foo";
然后
标准对缓冲区[4]到缓冲区[19]有何规定。它们是否也保证被初始化为零?所有剩余元素都保证被初始化为零 参考资料:
C++03标准第6.7.8节第21段: 如果大括号内的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组中的元素,则聚合的其余部分应为 与具有静态存储持续时间的对象隐式初始化相同
许多编译器会将缓冲区[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");
}
#包括
int main(){
char buf1[20]=“foo”;
char buf2[20]={};
int i;
对于(i=0;i<21;i++){
printf(“%02x”,buf1[i]);
}
printf(“\n”);
对于(i=0;i<21;i++){
printf(“%02x”,buf2[i]);
}
printf(“\n”);
}
请注意,我在条件中放入21而不是20只是为了将输出推到实际缓冲区分配之外。它应该在以后卸载一些垃圾字节。行为被C++标准(如所接受的答案中引用)所定义。它没有被排除为编译器的实现细节。你可以确信你不需要检查它的行为。你不能说什么“应该”。如果读取超出数组末尾,则会发生这种情况,这会导致未定义的行为。
#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");
}