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