qq_40565340
脆弱的yXin
2020-12-24 17:41
采纳率: 100%
浏览 88

C语言对字符数组初始化时,不加\0为什么会出现不同结果

问题来源于这道题,我一开始认为是相同的,后来实际操作发现确实不相同

我尝试了一下按照题目的做法

输出的时候不知道为什么ab后还有额外的字符

于是我尝试在ab后加了/0,结果就和我预想的一样了

为此我翻阅了高等教育出版社的C语言程序设计第三版(苏小红),书中这样说道

“一个字符串可以存于字符数组中,但一个字符数组中储存的并非一定是一个字符串,这要看它的最后一个元素是否为'\0',字符串数组是由字符构成的数组,仅当其最后一个元素是\0时才表示字符串”

所以想请教一下大家该怎么理解这句话呢,如果没有加\0,储存的又是什么呢。

在不加\0的情况下,为什么字符数组多了那么多字符呢,出现sizeof和strlen不等的原因又是什么

谢谢

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

6条回答 默认 最新

  • Yang9325
    猫叔压力大 2020-12-25 00:00
    已采纳

     

    int main() {
        char a1 = 0;//char a1 = 0; 这一行代码将x1后面的之后的内存赋值为0,0就相当于字符串休止符  strlen(x) = 2
    	char x1[] = {'a','b'};
    	cout << strlen(x1) << endl;
    	
    	return 0;
    }
    int main() {
        char a1 = 0;//char a1 = 0; 这一行代码将x1后面的之后的内存赋值为0,0就相当于字符串休止符  
    	char a2 = 1;//加上这一行之后 strlen(x) = 3
    	char x1[] = {'a','b'};
    	cout << strlen(x1) << endl;
    	
    	return 0;
    }

    希望这样你能看明白,可以考虑关注我。明天整理一下,写篇博客。

    点赞 评论
  • qq_25376897
    qq_25376897 2020-12-24 17:59

    %s 是遇到\0才停止,所以我猜中间多出来的字符,是因为它在输出完b之后,继续往后找,从而输出了这些

    点赞 评论
  • qq_25376897
    qq_25376897 2020-12-24 17:59

    %s 是遇到\0才停止,所以我猜中间多出来的字符,是因为它在输出完b之后,继续往后找,从而输出了这些

    点赞 评论
  • Yang9325
    猫叔压力大 2020-12-24 19:50

    strlen所作的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。

    找不到结束符,可以说结果是随机的也可能一直找不到然后超时了,也就是说strlen不适用于非字符串。

    char b[] = {'a','b','\0'}; 

    strlen(b);会输出2,这样才是正确的使用方式。

    点赞 评论
  • qq_40565340
    脆弱的yXin 2020-12-24 22:46

    我大概明白了strlen的作用,可是我还是不太明白,不加\0时,为什么x[]数组在b之后还有字符

    点赞 评论
  • Yang9325
    猫叔压力大 2020-12-25 00:34

    你应该是不太懂得内存的概念,这方面可以多研究,这个问题只要你懂得什么是内存,很快就能搞懂了。

     

    剩下的就是栈内存和寻址顺序这些东西再搞一搞。

     

    点赞 评论

相关推荐