猿问

为什么chac的结果是Hellohello而不是Hello

int main()
{
char sz[] = "hello";
puts(sz);
char chac[]={'H','e','l','l','o'};
puts(chac);
return 0;
}


Andrew111
浏览 1786回答 3
3回答

onemoo

C语言中规定:字符串是一串连续存放的char,并且以'\0'结尾。C语言中并没有字符串类型,为了满足C对字符串的定义,我们一般以char数组的形式来表示字符串,因为数组满足连续存放这一要求,但要注意:一定要以'\0'结尾。一般代码中这样写:char str[] = "Hello";这里用一个字符串字面量来初始化char数组str,字符串字面量是以'\0'结尾的,就是说"Hello"其实包含H e l l o这5个字符和结尾的'\0'一共6个字符。 这样str数组是含有6个char的数组,其中的字符分别是 H e l l o '\0',满足C语言对字符串的规定。所以你定义sz是正确的。那么如果你以初始化列表的形式初始化这样一个数组,就要注意显式加上结尾的'\0':char str[] = {'H', 'e', 'l', 'l', 'o', '\0'};否则,这只是一个char数组,并不满足字符串的规定。 所以你定义chac字符串的方式是错误的。要说明一下:str是个char数组这没有错,只不过无法把它当作字符串。C语言标准函数库中要求参数是字符串的函数,都要求该参数满足字符串的规定,最重要的就是一定要以'\0'结尾。实际上,这些函数大概是这样工作的:从这个字符串的第一个字符开始处理,直到处理到'\0'为止。你问的puts(chac)会打印出Hellohello 就是因为chac缺少了结尾的'\0': puts打印chac中的内容,打印完H e l l o后并没有遇到'\0',于是就继续打印后面内存中的内容。这就是缓冲区溢出漏洞,这是严重的安全隐患!  后面内存中有什么完全是无法确定的,有可能访问到不该访问的内容。 你这个例子中能继续打印出hello大概是因为chac后面的内存中正好是sz的内容(sz是以'\0'结尾的,所以结束了打印)。 但这绝对是错误的做法,一定要避免写这样的代码!

皓韵儿

是这样的吧,因为你在前面还输出了一个  puts(sz) ; 这个输出的是第一个 hello   然后在后面你又 puts(chac);  输出的是 Hello. 后面的那个, 望采纳 ,谢谢。
随时随地看视频慕课网APP
我要回答