为什么数组输出字符串后出现乱码?
#include<iostream>usingnamespacestd;intmain(){charca[5]={'e','d','c','b','a'};cout<<c...
#include<iostream>
using namespace std;
int main()
{
char ca[5]={'e','d','c','b','a'};
cout<<ca<<endl;
}
这样一个程序,为什么能输出正确值,但是在值得后面会出现乱码是怎么回事?求高手解答。
如果用static char ca[5]={'e','d','c','b','a'};就不会出现乱码?为什么?不明白? 展开
using namespace std;
int main()
{
char ca[5]={'e','d','c','b','a'};
cout<<ca<<endl;
}
这样一个程序,为什么能输出正确值,但是在值得后面会出现乱码是怎么回事?求高手解答。
如果用static char ca[5]={'e','d','c','b','a'};就不会出现乱码?为什么?不明白? 展开
5个回答
展开全部
你定义 char ca[5]={'e','d','c','b','a'};
输出时直接给ca,也就相当于字符数组的首地址,然后程序在输出打印数组时是从首地址然后一直打印到'\0'结束。而你程序的内存中在字符 'a'后面不是空白的,也就是有值的,所以就会打印出东西的。
所以你可以这样定义:char ca[6]={'e','d','c','b','a','\0'};这样就不会输出乱码了。
直接用char申请相当于是 auto型的,这个变量是在栈里面的,初始化是不确定的。但是用static申请的话在静态数据区,在静态数据区的数据未做初始化的话会自动初始化为0,所以字符 'a'后面是空白,也就是相当于'\0',所以不会出乱码。
输出时直接给ca,也就相当于字符数组的首地址,然后程序在输出打印数组时是从首地址然后一直打印到'\0'结束。而你程序的内存中在字符 'a'后面不是空白的,也就是有值的,所以就会打印出东西的。
所以你可以这样定义:char ca[6]={'e','d','c','b','a','\0'};这样就不会输出乱码了。
直接用char申请相当于是 auto型的,这个变量是在栈里面的,初始化是不确定的。但是用static申请的话在静态数据区,在静态数据区的数据未做初始化的话会自动初始化为0,所以字符 'a'后面是空白,也就是相当于'\0',所以不会出乱码。
展开全部
static变量是在静态数据区申请的内存,而静态数据区的内存在操作系统启动阶段就都初始化为0了,所以ca[4]后面地址的内存内容就已经是0了,所以就不会出现乱码
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
static char ca[5]={'e','d','c','b','a','\0'}
就没问题了
就没问题了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-11-14 · 知道合伙人软件行家
关注
展开全部
char ca[6]={'e','d','c','b','a'};//结尾还有 '\0'
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你查char字符数组没有结束符\0
追问
但是static申明的变量也没有/0结束符啊,就不出现乱码?这是为什么?
追答
static char ca[5]={'e','d','c','b','a'};
static变量存放的位置不同
局部静态变量
在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
1)内存中的位置:静态存储区
2)初始化:未经初始化的局部静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询