和前面的memcpy类似, strcpy/strncpy/strcat/strncat都存在内存重叠问题, 为了简便示意起见, 我用strcpy做例子来说明。 值得注意, 有时候, 在你的环境下, strcpy没有出现如下的问题, 不表明他真的没有问题。 看程序:
#include <stdio.h>
#include <string.h>
int main()
{
char str[100] = "abcdefghijklmn";
strncpy(str + 2, str, 5);
printf("%s\n", str);
return 0;
}
结果为:
[root@xxx ~/valgrind-3.8.1/bin]# g++ -g test.cpp
[root@xxx ~/valgrind-3.8.1/bin]# ./a.out
cdefgfghijklmn
[root@xxx ~/valgrind-3.8.1/bin]#
虽然暂时没有异常, 但这也仅仅是运气。 用 valgrind搞起:
[root@xxx ~/valgrind-3.8.1/bin]# g++ -g test.cpp
[root@xxx ~/valgrind-3.8.1/bin]#
[root@xxx ~/valgrind-3.8.1/bin]# ./valgrind --tool=memcheck --leak-check=y