memmove (MSDN) - быстрая коричневая лиса / собака

Я прочитал статью MSDN о memmove здесь:

http://msdn.microsoft.com/en-us/library/aa246469%28v=vs.60%29.aspx

и на их примере я не могу сказать, чем memmove отличается от memcpy. они оба дают одинаковый результат, хотя пример должен показать разницу. пожалуйста помоги.


person CaTx    schedule 02.01.2015    source источник
comment
Они различаются только тогда, когда источник и место назначения перекрываются.   -  person Barmar    schedule 02.01.2015
comment
да, Бармар, но в частично совпадающих примерах я не вижу разницы.   -  person CaTx    schedule 02.01.2015
comment
о, спасибо за отрицательные моменты, ребята. предложенная ссылка просто не отвечает на мой вопрос. Я спрашиваю о статье в MSDN, а не о самих функциях.   -  person CaTx    schedule 02.01.2015
comment
Результаты, указанные в статье, отличаются: Function: memmove with overlap … Result: The quick quick brown fox jumps over the lazy dog по сравнению с Function: memcpy with overlap … Result: The quick quick brown dog jumps over the lazy fox. Кроме того, использование memcpy() для перекрывающихся данных приводит к неопределенному поведению, включая возможность «работы, как ожидалось».   -  person Jonathan Leffler    schedule 02.01.2015
comment
Джонатан Леффлер, большое вам спасибо. Я пришел к такому же выводу несколько минут назад. это была плохо написанная статья MSDN.   -  person CaTx    schedule 02.01.2015
comment
как мне принять комментарий, являющийся ответом? знак равно   -  person CaTx    schedule 16.01.2015
comment
Хммм ... Я вижу отказ от ответственности, что ответ - это «расширенный комментарий, а не ответ», но он дает точную оценку проблемы. То же самое с дубликатом и предлагаемым дубликатом для дублирующего ответа - Что чем разница между memmove и memcpy?   -  person Jonathan Leffler    schedule 16.01.2015


Ответы (1)


Это расширенный комментарий, а не ответ. Пример MSDN - неудачный, сбитый с толку двумя похожими исходными строками: «Быстрая коричневая лиса перепрыгивает через ленивую собаку» и «Быстрая коричневая собака перепрыгивает через ленивую лису». Мой MS Visual C дает правильный результат с memcpy(), когда источник и место назначения перекрываются, но, как писал @PaulRoub (теперь удален), только потому, что один компилятор кодирует это правильно, не означает, что другой будет.

#include <stdio.h>
#include <string.h>

int main()
{
    char str [] = "abcdefghijklmnopqrstuvwxyz";
    printf ("%s\n", str);    

    memcpy (str, str+1, 25);    // copy down
    printf ("%s\n", str);    

    memcpy (str+1, str, 25);    // copy up
    printf ("%s\n", str);    

    return 0;
}

Программный вывод

abcdefghijklmnopqrstuvwxyz
bcdefghijklmnopqrstuvwxyzz
bbcdefghijklmnopqrstuvwxyz
person Weather Vane    schedule 02.01.2015