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

使用strcat函数时,前一个字符串数组空间不够,但是依然把后一个字符串数组拼接好并输出无误,为什么呢?

使用strcat函数时,前一个字符串数组空间不够,但是依然把后一个字符串数组拼接好并输出无误,为什么呢?

C
明心2018 2017-04-15 23:11:27
用Dev C++编译,使用strcat函数时,前一个字符串数组空间不够,但是依然把后一个字符串数组拼接好并输出无误,为什么呢?(教程里是说,前一个字符串数组空间的长度要足够,但是在Dev C++里面,长度不够也不会出错)
查看完整描述

3 回答

已采纳
?
onemoo

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

先要肯定一点:教程没有说错!  你在编程时必须要注意这一点:保证strcat的第一个参数有足够的空间!


为什么没报错呢? 因为:

这个函数的参数是指针类型,函数中也只是通过指针来读写这些内存,编译器无从得知这几块内存到底多大,所以编译阶段编译器不会报错。

函数的行为大致就是先找到第一个参数所指的内存中字符串结尾的位置,然后从此处开始依次写入第二个参数中的字符...直到写完。函数也根本不知道第一个参数所指的内存空间到底够不够大,所以函数本身也不会对此检查。

而在运行时,如果向第一个参数处写入了过多的字符,则有可能会引起问题,也有可能不会:

  • 假如第一个参数所指的内存空间后面的内存刚好也是可读写的,那么函数就继续向其中写入字符,虽然这已经是算写“越界”了,但函数不知道啊。 这样后面输出时就会把这字符串完整地输出。

  • 但假如第一个参数所指内存后面不可写,到函数写越界时就会引起运行时错误。


所以这样的代码在很多时候不会触发运行时错误而运行出看似正确的结果,但这是非常错误的代码!  即便后续的内存是可写的,但也许其中存着其他数据,写越界就有可能覆盖这些数据,引起其他bug,这是严重的安全隐患! 其实所谓“缓冲区溢出漏洞”大致就是这样来的。

查看完整回答
1 反对 回复 2017-04-16
?
望远

TA贡献1017条经验 获得超1032个赞


最好是保证第一个空间长度足够,不足也会尝试继续往后放第二个字符串的字符,但是这种做法是十分危险的,可能会覆盖掉一些有用的数据,导致程序的不可预知的错误,也可能是尝试往一个可读不可写的存储空间写入数据则程序直接崩溃。

查看完整回答
1 反对 回复 2017-04-16
  • 3 回答
  • 0 关注
  • 3931 浏览

添加回答

举报

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