c/c++字符数组和字符串大揭秘
第一:写这篇文章源于我对'\0'和“\0”的探讨
当我对char a []="\0";
int size_a=sizeof(a); //结果为2
当时我很纳闷字符串不是以'\0'结束吗,然后我又测试 :
char a[]="b\0";
cout<<sizeof(a); //结果为3
再次测试:
char a[]="\0\0\0";
cout<<sizeof(a); //结果为4
最后测试:
char a[]="";
cout<<sizeof(a); //结果为1
通过测试发现字符串里的\0是系统自动添加,而且不管你原串里是否有\0;
第二:
示例一:int main(int argc, char *argv[])
{ char str[] = {'H','e','l','l','o'};
char bb[]={
'a','b','c','D'
};
cout<<bb<<endl;
输出结果如下:注意每次运行输出结果最后0后面的那个字符会不一样
示例二:int main(int argc, char *argv[])
{ char str[] = {'H','e','l','l','o'};
char bb[]={
'a','b','c','D'
};
cout<<str<<endl;
输出结果如图
为什么图一输出的结果是abcDHello*(*号表示随机字符)?我们可以推测出由于采用栈的存储结构,所以在函数中先定义的先压栈测试如下面的
示例三:
int main(int argc, char *argv[])
{ char str[] = {'H','e','l','l','o'};
char bb[]={
'a','b','c','D'
};
char cc[]={
'A','B'
};
cout<<cc<<endl;
输出结果如下图:
然后我们探讨一下最末尾为啥就一个随机数字呢,
int main()
{
char str[] = {'H','e','l','l','o'};
char bb[]={'a','b','c','D' };
char cc[]={'A','B'};
bb[7]='\0';
cout<<bb<<endl;
结果如下图,如果对b[7]='\0',那么输出截止到bb后面第七个
以上测试是在mingw gcc version3.2测试的,用的是cfree,注意我用vs2010测试结果不一样啊
测试如图
地址高的地方在栈底,输出的时候,比如输出cc吧,ab烫烫abcd烫烫几下,然后hello在烫几下最后输出也结束,至于最后为啥结束,我再探讨ing
希望大牛斧正!