为什么数组输出字符串后出现乱码?

#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'};就不会出现乱码?为什么?不明白?
展开
 我来答
冷明珠05v
推荐于2018-04-24 · TA获得超过1502个赞
知道小有建树答主
回答量:389
采纳率:100%
帮助的人:543万
展开全部
你定义 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',所以不会出乱码。
召走刀文
2012-11-14 · TA获得超过1204个赞
知道小有建树答主
回答量:597
采纳率:57%
帮助的人:229万
展开全部
static变量是在静态数据区申请的内存,而静态数据区的内存在操作系统启动阶段就都初始化为0了,所以ca[4]后面地址的内存内容就已经是0了,所以就不会出现乱码
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cpucash
2012-11-14 · TA获得超过1584个赞
知道小有建树答主
回答量:1457
采纳率:66%
帮助的人:963万
展开全部
static char ca[5]={'e','d','c','b','a','\0'}
就没问题了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lgao622
2012-11-14 · 知道合伙人软件行家
lgao622
知道合伙人软件行家
采纳数:1137 获赞数:6549
毕业于武汉工程大学邮电与信息工程学院通信专业,软件行业,4年工作经验。

向TA提问 私信TA
展开全部
char ca[6]={'e','d','c','b','a'};//结尾还有 '\0'
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
沧海雄风2009
2012-11-14 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8525
采纳率:79%
帮助的人:2804万
展开全部
你查char字符数组没有结束符\0
追问
但是static申明的变量也没有/0结束符啊,就不出现乱码?这是为什么?
追答
static char ca[5]={'e','d','c','b','a'};

static变量存放的位置不同

局部静态变量
在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
  1)内存中的位置:静态存储区
  2)初始化:未经初始化的局部静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式