为什么memcpy()无法复制同一数组中具有偏移量的数组元素

为什么memcpy()无法复制同一数组中具有偏移量的数组元素,c,memcpy,C,Memcpy,我试图复制数组本身内部的内容,但带有偏移量或来自偏移量。例如: int main(void) { char a[4] = { 'a', 'b' , 'c', 'd' }, b[4], c[4]; memcpy(b, a, 4); memcpy(c, b, 4); memcpy(b, b + 1, 3); memcpy(c + 1, c, 3); for(unsigned i = 0; i < 4; i++) printf

我试图复制数组本身内部的内容,但带有偏移量或来自偏移量。例如:

int main(void) {
    char a[4] = { 'a', 'b' , 'c', 'd' }, b[4], c[4];

    memcpy(b, a, 4);
    memcpy(c, b, 4);

    memcpy(b, b + 1, 3);
    memcpy(c + 1, c, 3);

    for(unsigned i = 0; i < 4; i++)
        printf("%c", b[i]);
    printf("\n");

    for(unsigned i = 0; i < 4; i++)
        printf("%c", c[i]);

    return 0;
}
我还期待着呢

bcdd
aabc
第一个memcpy是有效的,但第二个memcpy不是,在我看来它是不一致的,所以我做错了什么


我不明白我做错了什么。为什么它失败了。此外,如果我尝试执行相同的操作,但对于结构数组(例如),是否仍会发生这种情况?

2018 C标准在第7.24.2.1条中指定了memcpy。第2段说:

…如果复制发生在重叠的对象之间,则行为未定义

要在数组中移动数据,请使用memmove。其规范在7.24.2.2中规定:

复制时,s2指向的对象中的n个字符首先复制到不与s1和s2指向的对象重叠的n个字符的临时数组中,然后将临时数组中的n个字符复制到s1指向的对象中


s1是目标,s2是源,n是要复制的字节数。

对于重叠内存,不要使用memcpy,而是使用。c的错误是由错误方向的复制引起的。当一个例程不能按您想要的方式工作时,请查找并阅读它的文档。@JoopEggen,谢谢!你说的for-like向错误的方向复制是什么意思?当人们使用for循环时:for-int i=0;i<3++ic[i+1]=c[i];一个人会得到错误的aaaa。这里的另一个方向是:对于int i=3-1;i>=0-ic[i+1]=c[i];我不知道这与重叠的对象有关。谢谢因此,除了标准中提到它之外,没有任何技术上的解释来解释为什么这会失败?@Cătălinaîrbu:常规程序不会失败;其行为符合其文档。至于它不能按您希望的方式工作的原因,毫无疑问,它至少部分地被编写为一些简单的循环,比如int i=0;ibcdd aabc