2 回答
TA贡献1921条经验 获得超9个赞
取决于编译器memcpy实现的方式
一般有三种,从头复制 从尾复制 或者判断复制(等同于memmove)
仿照你的 我写了一个测试程序
char message2[60] = "abcdefghijklmnopqrstuvwxyz" ; char tmp[60]; int main() { strcpy (tmp, message2); printf ( "tmp= \"%s\"\n" , tmp); memcpy (tmp+4, tmp + 16, 10); printf ( "memcpy(tmp+4, tmp + 16, 10);> tmp = \"%s\"\n" , tmp); strcpy (tmp, message2); memcpy (tmp+6, tmp +4, 10); printf ( "memcpy(tmp+6, tmp +4, 10);> tmp = \"%s\"\n" , tmp); strcpy (tmp, message2); memcpy (tmp+4, tmp +6, 10); printf ( "memcpy(tmp+4, tmp +6, 10);> tmp = \"%s\"\n" , tmp); } |
测试结果如下
tmp= "abcdefghijklmnopqrstuvwxyz"
memcpy(tmp+4, tmp + 16, 10);> tmp = "abcdqrstuvwxyzopqrstuvwxyz"
memcpy(tmp+6, tmp +4, 10);> tmp = "abcdefefefijijmnqrstuvwxyz"
memcpy(tmp+4, tmp +6, 10);> tmp = "abcdghijklmnopopqrstuvwxyz"
可以看到 在memcpy(tmp+6, tmp +4, 10);时出现了覆盖 efefef
说明我的编译器(gcc)在做memcpy的时候使用的是头复制 即从起始地址开始复制
如果这个不出错 而memcpy(tmp+4, tmp +6, 10);出错 那么就是尾复制
都不出错的话 那么就是判断之后智能复制 相当于memmove
TA贡献1806条经验 获得超5个赞
该例子说明几个问题
1. mem开头的函数基本上都是对内存操作的,
它们不管内存里放的是什么数据,只要给出长度,它们就操作。
不像strcpy、strcmp等函数一定以'\0'结尾,而且是字符。
mem可以操作可见字符、不可见字符、控制字符等,任意数据都可以。
2. memcpy是内存复制函数
原型:
void * memcpy(void *dest, void const *src, unsigned int length);
功能:从src的起始位置复制length个字节到dst的内存起始位置。你可以用这种
方法复制任何类型的值,第3个参数指定复制值的长度(以字节计)。
如果src和dst以任何形式出现了重叠,它的结果是未定义的。
3. memset函数
原型:void * memset(void *a, int val, unsigned int length);
功能:把从a开始的length个字节都设置为值val。
例子:memset(buffer, 0, SIZE);
添加回答
举报