может ли структурное назначение перекрываться аналогично memmove () или структурное назначение похоже на memcpy ()? - PullRequest
0 голосов
/ 20 декабря 2018

Существуют две разные функции для создания копии области данных в стандартной библиотеке C, memmove() используется для перекрывающихся областей памяти и memcpy() для непересекающихся, непересекающихся областей памяти.

Чтостандарты C говорят о присвоении структуры следующим образом:

struct thing myThing = {0};
struct thing *pmyThing = &myThing;

myThing = *pmyThing;     // assign myThing to itself through a pointer dereference.

Соответствует ли присвоение структуры правилам memmove() или memcpy() или своим собственным правилам в отношении перекрывающихся областей памяти?

1 Ответ

0 голосов
/ 20 декабря 2018

Раздел 6.5.16.1 («Простое присвоение») стандарта C (чтение из черновика N1548) гласит:

В простое присвоение (=),значение правого операнда преобразуется в тип выражения присваивания и заменяет значение, хранящееся в объекте, обозначенном левым операндом.

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

Стандарт C не определяет как компилятор реализует простое присваивание.Но перекрытие между источником и назначением разрешено, если перекрытие является точным и типы совместимы.Самостоятельное назначение (через указатель или нет) отвечает этому требованию, и, таким образом, поведение четко определено.

...