比如下面这个例子
char src[10]="abcdefg";
下面哪个函数能够使src内容变成‘aabcdefg’
strncpy(src+1,src,7);
memcpy(src+1,src,7);
memmove(src+1,src,7);
这涉及源地址和目标地址有重叠的情况。
strncpy原理上仍然是按照顺序一个一个字节的复制,所以输出是‘aaaaaaa’
memmove允许源地址和目标地址重叠,这种复制方式最安全,可以满足要求。
memcpy的输出是aaaccefg.那么它是如何执行的呢,我分别复制不同的字节数,从1-->7发现
它按照内存结构,以1,2,4为基数字节进行复制,比如复制7个,就按照1+2+4的方式,先复制1个,然后复制2个,最后复制剩余4个
abcdefg复制1个变成aacdefg,然后复制2个变成aaacefg,最后复制4个变成aaaccefg.
以上测试均基于Linux gcc编译器
有兴趣的可以试一下。