3.9 调用memcpy函数前未初始化缓冲区
代码示例
int main(){
char buffer[10];
memcpy(buffer , "hello wo" , 3);
printf("buffer=%s\n", buffer);
return 0;
}
- 现象&后果
运行程序,发现buffer打印出的内容除了"hel"之外还有其他字符。
Bug分析
上述代码的问题主要在于没有对buffer作初始化。当调用memcpy函数时,如果第三个参数设置的复制字节数小于buffer的字节数,buffer尾部剩余字节中的内容是不可预知的,从而可能导致严重错误。所以,最好在使用memcpy函数前调用memset函数,将buffer中所有位置初始化为0。
正确代
int main(){
char buffer[10];
memset(buffer , 0 , 10);
memcpy(buffer , "hello wo" , 3);
printf("buffer=%s\n", buffer);
return 0;
}
编程建议
memcpy函数是纯字节复制,不管字节中的内容,并且源地址和目标地址都需要确保有大于第三个参数指定的大小,否则复制会产生溢出,此外,源地址和目标地址所指向的存储空间也不能重叠。