C语言定义字符型数组时,两种初始化方式的区别?

chara[]={'a','b','c','d'};charb[]="abcd";我查资料说两个的区别时上面一个是长度为4,下面一个长度为5,因为下面那个还有一个表示结束... char a[]={'a','b','c','d'};char b[]="abcd";我查资料说两个的区别时上面一个是长度为4,下面一个长度为5,因为下面那个还有一个表示结束的'\0',但是我用了两个不同的C语言编程工具得到的结果都不是这样,使用strlen求b的长度的时候竟然是8更离谱的是我要输出整个b的时候,它不但输出了整个b,还在后面跟上了整个a 展开
 我来答
听不清啊
高粉答主

2022-01-17 · 说的都是干货,快来关注
知道顶级答主
回答量:7.8万
采纳率:89%
帮助的人:1.9亿
展开全部

这二种初始化方式的区别在于第一种方法是存储了5个字节的内容,即能看到的个字母,外加一个字符串结束符'\0'。这样才能正确地以%s的形式来输出这个字符串;而第二种方法则是只存储了4个字母,但是却没有字符串结束符,所以它不能以%s的形式正确输出。如果也要以%s的形式输出这个字符串,那就应该在末尾增加一个字节,用来存储一个字符串结束符'\0'。

Yuqi_Tan

2022-01-16 · TA获得超过8.9万个赞
知道大有可为答主
回答量:9918
采纳率:93%
帮助的人:3465万
展开全部
char a[]={'a','b','c','d'};
char b[]="abcd";
你查资料说两个的区别时,说上面一个是长度为4,下面一个长度为5,因为下面那个还有一个表示结束的'\0'。这是很正确的。
但是,你用两个不同的C语言编程工具得到的结果都不是这样。这应该是编程工具的区别。
使用strlen求b的长度的时候是8,另外要输出整个b的时候,它不但输出了整个b,还在后面跟上了整个a。这也是正常的。原因是:
b存储的4个字符并不是字符串,当你按照字符串长度函数strlen函数时,系统会在内存中从第一个字符开始查找结束符,一直找到为止,而这是不可预知的。
你得到的8是碰巧了。
还有,你打印b字符串,后面把a字符串也打印出来了,只是内存中碰巧的结果,它也是不可预知的。
比如,你把a去掉,只保留b,看一看就知道了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
arongustc
科技发烧友

2022-01-16 · 智能家居/数码/手机/智能家电产品都懂点
知道大有可为答主
回答量:2.3万
采纳率:66%
帮助的人:6002万
展开全部
因为你前半段说的长度是用sizeof算的,不是用strlen算的。如果是strlen算的,你必须确保字符串有\0结尾,所以你第一种初始化方式得到的数组是禁止用strlen的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
shine1991
科技发烧友

2022-01-16 · 智能家居/数码/手机/智能家电产品都懂点
知道顶级答主
回答量:4.7万
采纳率:82%
帮助的人:2.3亿
展开全部

strlen和printf中的%s都是以字符串结束符'\0'作为结束标志的

而逼的数组b定义时没有多复制一个字符串结束符,导致数组越界访问,直至遇到'\0'采集结束输出/判断字符串长度

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式