1. ‘\0’的问题
用char数组存储的时候要特别小心,例如我们要存储三个数字
int main()
{
char num[3];
num[0]='0';
num[1]='1';
num[2]='2';
printf("%s",num);
return 0;
}
结果
我们输出了123还有而外的6个字符,我用的是vs2015,打开内存查看器,根据num的地址定位到num在内存中存储的位置,如下图所示
printf
输出的图上画红线的地方,(31) (32) (33) (cccc) (cccc) (cc40) (f82f) (01ce) (1fcc)
最后的00
会被翻译成\0
所以就停止输出了,至于为什么这么多cc
,应该是栈空间未初始化的空间都被初始化成了cc,所见经常喜闻乐见的见到烫烫烫
刚刚是局部变量,那我们再试一下全局变量
char num[3];
int main()
{
num[0]='0';
num[1]='1';
num[2]='2';
printf("%s",num);
return 0;
}
结果
正常输出了123,接下来我们看一下内存的情况
内存里存了31 32 33 然后紧接着就是00
,00
会被理解成\0
所以就停止的输出,全局变量区不会像堆区那样初始化成cc
,都是初始化成了00
,所以这才遇见了终止符号,停止了输出。那是不是全局变量就不用定义了终止符了呢?那并不是这样的,当然还是要定义终止符号的!!!
2. 中文的问题
这个问题就相对比较简单了,中文用两个字节来存储,意思就是char c[2]
只能存储一个中文字符,这可能是初学时容易忽略的问题。
编译器:VS2015