请问关于char数组初始化的问题

atomicink 2012-10-22 08:12:57
char test1[10]="";
char test2[10]={};
char test3[10]={0};

三种有何区别呢?
...全文
13723 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yddd2011 2012-10-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

看下面的测试代码:
C/C++ code

#include <iostream>

using namespace std;

class A {
public:
A() {
cout<<"A::A()"<<endl;
}

A(int val) {
cout<<"A::A(int)"<<endl;
}
};

int mai……
[/Quote]

up
图灵狗 2012-10-23
  • 打赏
  • 举报
回复
很多情形下都是0没错,但这是编译器不保证的。

[Quote=引用 5 楼 的回复:]

就是LZ实验的结果,都一样,10个空间全部填0。
1L的描述有误哦,可以用debugger跟踪看看。
[/Quote]
ForestDB 2012-10-23
  • 打赏
  • 举报
回复
就是LZ实验的结果,都一样,10个空间全部填0。
1L的描述有误哦,可以用debugger跟踪看看。
virtualxmars 2012-10-22
  • 打赏
  • 举报
回复
看下面的测试代码:

#include <iostream>

using namespace std;

class A {
public:
A() {
cout<<"A::A()"<<endl;
}

A(int val) {
cout<<"A::A(int)"<<endl;
}
};

int main() {
cout<<"init by string"<<endl;
char a[] = "abc";
cout<<sizeof(a)<<endl;
cout<<a[0]<<a[1]<<a[2]<<endl;

cout<<"init by nothing"<<endl;
A objs[2] = {};
char ss[10] = {};
cout<<strlen(ss)<<','<<(int)ss[1]<<endl;

cout<<"init by int val"<<endl;
A objs2[2] = {0};
char sss[10] = {0};
cout<<strlen(sss)<<','<<(int)ss[1]<<endl;

return 0;
}


输出:
init by string
4
abc
init by nothing
A::A()
A::A()
0,0
init by int val
A::A(int)
A::A()
0,0

结论:
第一种:数组会根据字符串的内容,包括'\0'结束符初始化数组内容,考虑到这种方式仅适用于字符串,所以很可能在开辟了内存空间后,是将常量内容直接整块复制过去的,不存在调用默认构造函数还是拷贝构造函数的问题。

第二种,从输出可见,实际上会调用每个对象的默认构造函数。而编译器一般会对字符串进行特别处理。从上面可见,编译器实际上对整个数组进行了清零。但这种行为依赖于编译器,所以并不是可靠的。

第三种,会使用花括号内的值对数组的第一个元素进行初始化,并使用了可用于该值的构造函数。而所有后续的数组值都是调用默认构造函数进行初始化的。和第二种一样,编译器也会做出特殊处理,但这种方式保证了数组值一定拥有正确的结束符。
atomicink 2012-10-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

到编译环境里去试下 最直接了
[/Quote]

试过感觉一样的才来问的
loishf 2012-10-22
  • 打赏
  • 举报
回复
到编译环境里去试下 最直接了
图灵狗 2012-10-22
  • 打赏
  • 举报
回复
char test1[10]="";
char test3[10]={0};
以上两种是一样的,都是初始化为空串。
char test2[10]={};
以上数组未被初始化。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧