将数组传递给函数时,一定要同时传递数组长度。这个信息帮助函数避免越过数组边界。在下面的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这类不传递缓冲区长度的函数。传递缓冲区长度能提供额外的安全屏障。
极客教程