自定义ft_bzero与原生bzero行为差异原因咨询
自定义ft_bzero与原生bzero行为差异的原因
自定义实现代码
void ft_bzero(void *s, size_t n) { char *str; size_t i = 0; str = (char *)s; while (i <= n) { str[i] = 0; i++; } return ; }
测试代码
int main(void) { char str[3] = {"abc"}; ft_bzero(str, 2); for (int i = 0; i < 3; i++) printf("%c", str[i]); return (0); }
差异原因
核心问题出在自定义ft_bzero的循环条件:while (i <= n)。
- 原生
bzero的定义是将起始地址s处的前n个字节置为0,只会覆盖索引0到n-1的位置。 - 你的循环条件会让索引从
0遍历到n,总共覆盖n+1个字节。
对应到测试用例:
调用ft_bzero(str,2)时,你的代码会把str[0]、str[1]、str[2]全部置为0(因为i<=2),整个数组都是空字符,printf输出空字符不会显示任何内容;而原生bzero仅将str[0]和str[1]置0,str[2]保留原有的'c',所以会输出该字符。
修正方案
将循环条件改为while (i < n),即可与原生bzero行为保持一致:
while (i < n) { str[i] = 0; i++; }
内容的提问来源于stack exchange,提问作者dongyeob
相关产品推荐
相关产品推荐

