关于memcpy()函数
这个程序说memcpy()函数,当源内存块与目标内存块重叠时,将会覆盖掉原来了数据,我运行的时候没覆盖啊,是可能覆盖吗?一下是运行结果。...
这个程序说memcpy()函数,当源内存块与目标内存块重叠时,将会覆盖掉原来了数据,我运行的时候没覆盖啊,是可能覆盖吗?一下是运行结果。
展开
2个回答
展开全部
取决于编译器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
展开全部
该例子说明几个问题
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);
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);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询