为什么chac的结果是Hellohello而不是Hello
int main(){char sz[] = "hello";puts(sz);char chac[]={'H','e','l','l','o'};puts(chac);return 0;} |
免责声明:本内容仅代表回答会员见解不代表天盟观点,请谨慎对待。
版权声明:作者保留权利,不代表天盟立场。
|
|
|
|
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'结尾的,所以结束了打印)。 但这绝对是错误的做法,一定要避免写这样的代码! |
|
|
|
|
是这样的吧,因为你在前面还输出了一个 puts(sz) ; 这个输出的是第一个 hello 然后在后面你又 puts(chac); 输出的是 Hello. 后面的那个, 望采纳 ,谢谢。 |
|
|
|
|