问题描述
解决方案
首先,你的前两行变量定义等价于:
char a[6] = {'h', 'e', 'l', 'l', 'o', 0};
char b[5] = {0, 0, 0, 0, 0}
注意 a 实际有 6 个元素,且最后一个是 0.
在内存中,这两个变量实际是连续存储的:
0, 0, 0, 0, 0, 'h', 'e', 'l', 'l', 'o', 0
也就是 b 在前,a 在后。
当你执行循环后,这一段内容变为:
'h', 'e', 'l', 'l', 'o', 'h', 'e', 'l', 'l', 'o', 0
在执行输出时,printf 寻找b之后的第一个 0 作为结尾,也就 printf 是从前面的 h 到最后的 0 之前一个文字全部输出,因此结果是
hellohello
解决方案二:
这个代码告诉你一个事实,那就是C语言不会对下标越界做出判断。
你的程序根本就是错的,第二个数组长度不够,但是你试图去复制第一个数组,访问超过它长度的下标,你仍然有可能得到预期的结果。
但是不因为它能得到结果就是对的,如果正好这个数组后面的内存被分配了,那么程序就可能出错。
好比,闯红灯不是每次都会被压死。但是你不能说闯红灯没被压死就觉得闯红灯是对的。
顺便说下,C语言过于简陋的语言检查使得它不适合初学者,这个例子就是证明。
解决方案三:
这个输出是随机的,使用printf输出字符串时,只输出到字符串的结束符,就是'',你把数组a[]的值逐个赋数组b[]之后,没有添加结束标志,所以输出的时候除了在hello后面还有一串字符,这个跟计算机的储方式有关,在不同的机器上存储的有可能不一样。你把最开始的赋值语句颠倒一下顺序,或者在多定义几个其他的变量,说不定输出有不一样。
解决方案四:
我不认可C语言过于简陋,我你这个问题就是因为C语言不进行边界检查造成的,你在编写程序的时候一定要时刻关注内存,不然写出来的程序就有可能有溢出
解决方案五:
C++输出格式
解决方案六:
初学c++ 常常犯的错误 字符串后面常常忘记''
字符串长度 strlen(s) 要价一。
解决方案七:
这个·······我也不晓得
解决方案八:
这C 也太神奇了吧,不懂啊