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

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

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

温馨提示:答案为网友推荐,仅供参考
第1个回答  2022-01-16
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,看一看就知道了。
第2个回答  2022-01-16
因为你前半段说的长度是用sizeof算的,不是用strlen算的。如果是strlen算的,你必须确保字符串有\0结尾,所以你第一种初始化方式得到的数组是禁止用strlen的
第3个回答  2022-01-16

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

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