3 回答
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'结尾的,所以结束了打印)。 但这绝对是错误的做法,一定要避免写这样的代码!
TA贡献86条经验 获得超114个赞
是这样的吧,因为你在前面还输出了一个 puts(sz) ; 这个输出的是第一个 hello 然后在后面你又 puts(chac); 输出的是 Hello. 后面的那个, 望采纳 ,谢谢。
- 3 回答
- 0 关注
- 1785 浏览
添加回答
举报