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

关于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 可以重叠.