• 手机版

    扫码体验手机版

  • 微信公众号

    扫码关注公众号

国内首家协议开发

软芯音视解码保护平台

在线
客服

发布
需求

在线
聊天

天盟
APP

天盟APP下载

关注
微信

微信扫一扫访问
顶部

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

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

免责声明:本内容仅代表回答会员见解不代表天盟观点,请谨慎对待。

版权声明:作者保留权利,不代表天盟立场。

使用道具 举报

全部参与2

C语言中规定:字符串是一串连续存放的char,并且以'\0'结尾
C语言中并没有字符串类型,为了满足C对字符串的定义,我们一般以char数组的形式来表示字符串,因为数组满足连续存放这一要求,但要注意:一定要以'\0'结尾。


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

使用道具 举报

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

使用道具 举报

发新帖

发布任务需求已有1031290位用户正在使用天盟网服务

发布分类: *
任务预算: *
需求内容: *
手机号码: *
任务商家报价为
  • 预算价 :
  • 成交价 :
  • 完工期 :
  • 质保期 :

* 最终任务项目以服务商报价、双方协商为准!