为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
Andrew111 2016-10-06 19:01:45
int main() { char sz[] = "hello"; puts(sz); char chac[]={'H','e','l','l','o'}; puts(chac); return 0; }
查看完整描述

3 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

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'结尾的,所以结束了打印)。 但这绝对是错误的做法,一定要避免写这样的代码!

查看完整回答
2 反对 回复 2016-10-06
?
皓韵儿

TA贡献86条经验 获得超114个赞

//img1.sycdn.imooc.com//57f6478100016bf701220086.jpg是这样的吧,因为你在前面还输出了一个  puts(sz) ; 这个输出的是第一个 hello   然后在后面你又 puts(chac);  输出的是 Hello. 后面的那个, 望采纳 ,谢谢。

查看完整回答
1 反对 回复 2016-10-06
  • 3 回答
  • 0 关注
  • 1785 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信