来自 C 标准:
7.21.2.4 strncpy 函数
如果复制发生在重叠的对象之间,则行为未定义。
什么是重叠?
很明显,当目标字符串的开头与源字符串的结尾交叉时,它是重叠的。
但是在下一个示例中是否发生了重叠?
const char* dateConst = "2017-01-25";
char* date = malloc(16);
strcpy(date, dateConst);
strncpy(date+4, date+5, 2);
strncpy(date+6, date+8, 3);
printf("%s\n", date);
输出:20170125
如果 strncpy 只是像在这个实现中那样逐个字符地复制符号,应该没有问题。