首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于memcpy()源地址和目的地址内存区域覆盖有关问题

2012-05-01 
关于memcpy()源地址和目的地址内存区域覆盖问题void *memcpy(void *dest, const void *src, size_t n)看

关于memcpy()源地址和目的地址内存区域覆盖问题
void *memcpy(void *dest, const void *src, size_t n);
看注释:
1.source和destin所指内存区域不能重叠,函数返回指向destin的指针。?
但是我现在运行的一个程序在visual studio也可以运行出结果,没任何Warning和Error
大神怎么解释?
int main()
{
char str[5]="abcd";
? memcpy(str,&str[1],sizeof(str) - 1);
? printf("%s",str);
system("pause");
return 0;

}
bcd请按任意键继续. . .


[解决办法]
memcpy()会自己调整复制的方向.不会出现你说的错误 ,
[解决办法]
错误的使用方式 并不总出现错误.
按照你所说的需求你需要调用的是memmove
[解决办法]
用这个代码, 编译 Release 版本就能看到区别了:

C/C++ code
void copy(){    char str[]="abcdefghijklmn";    memcpy(&str[1],&str,sizeof(str) - 2);    printf("%s\n",str);}void move(){    char str[]="abcdefghijklmn";    memmove(&str[1],&str,sizeof(str) - 2);    printf("%s\n",str);}int main(){    copy();    move();    system("pause");    return 0;}
[解决办法]
你确定当两个地址是一样的时候这函数会工作,而不是直接return ???
[解决办法]
探讨
错误的使用方式 并不总出现错误.
按照你所说的需求你需要调用的是memmove

[解决办法]
探讨

memcpy()会自己调整复制的方向.不会出现你说的错误 ,

[解决办法]
7.21.2.1 The memcpy function
Synopsis
1 #include <string.h>
void *memcpy(void * restrict s1,
const void * restrict s2,
size_t n);
Description
2 The memcpy function copies n characters from the object pointed to by s2 into the
object pointed to by s1. If copying takes place between objects that overlap, the behavior
is undefined.
Returns
3 The memcpy function returns the value of s1.
259) See

=====
查了一下,是不能重叠的...重叠的行为未定义.所以也有可能正常或者不正常.
用memmove 可以重叠.

热点排行