将数组传递给函数时,一定要同时传递数组长度。这个信息帮助函数避免越过数组边界。在下面的replace
函数中,将字符串的地址随着替换用的字符以及缓冲区长度一块传入,函数的目的是把字符串中所有的字符都替换为传入的字符,直到NUL
字符。长度参数防止函数越过缓冲区写入:
在下面的代码中,name
数组最多只能装7个字符再加上NUL
字符。不过,我们有意越过数组边界写入来说明replace
函数的工作原理。我们给replace
函数传递了name
和替换字符+
:
执行代码后得到如下输出:
只是向数组添加了8个加号,strcpy
函数允许缓冲区溢出,但是replace
函数不允许,前提还是假设传入的长度信息有效。要谨慎使用strcpy
这类不传递缓冲区长度的函数。传递缓冲区长度能提供额外的安全屏障。