2 回答
char s1[10] = "hello";
表示在内存中申请能放10个char类型的空间,并给这个空间附初始值“hello\n”('\n'表示字符串的结尾,占一个char空间)。s1的总大小是10,现在占用了6个空间,还剩4个空间。
strcat(s1,s2);
是把s2的内容往s1后面加,直到s2遇到'\n'字符,所以需要s1有足够多的空间。如果s1和s2内存一样,那就相当于一个字符串往自己后面加内容,举个例子,s1和s2内存一样,都是指向内容为“abcd\n”的内存,那么strcat的运行过程如下:
第一步:将s1指向的第一个内容复制到s2的末尾,也就是将‘a’复制到‘d’后面,结果为“abcda”,再判断s1指向的第一个内容是否为‘\n’,是则结束,否则s1和s2都往后一个指;这里是否,所以进行下一步;
第二步:将s1指向的第一个内容复制到s2的末尾,也就是将‘b’复制到第二个‘a’后面,结果为“abcdab”,再判断s1指向的第一个内容是否为‘\n’,是则结束,否则s1和s2都往后一个指;这里是否,所以进行下一步;
第三步:将s1指向的第一个内容复制到s2的末尾,也就是将‘c’复制到第二个‘b’后面,结果为“abcdabc”,再判断s1指向的第一个内容是否为‘\n’,是则结束,否则s1和s2都往后一个指;这里是否,所以进行下一步;
第四步:将s1指向的第一个内容复制到s2的末尾,也就是将‘d’复制到第二个‘c’后面,结果为“abcdabcd”,再判断s1指向的第一个内容是否为‘\n’,是则结束,否则s1和s2都往后一个指;这里是否,所以进行下一步;
第五步:将s1指向的第一个内容复制到s2的末尾,也就是将第二个‘a’复制到第二个‘d’后面,结果为“abcdabcda”,再判断s1指向的第一个内容是否为‘\n’,是则结束,否则s1和s2都往后一个指;这里是否,所以进行下一步;
。。。。。。
会发现,s1的第一个内容永远不会是‘\n’(结束符),所以就这样一直死循环下去了。(这里的s1和s2在实际代码中会换成工作指针,这里为了更明了,就不替换为工作指针了)
举报