Отвечая на другой вопрос, я подумал о следующем примере:
void *p;
unsigned x = 17;
assert(sizeof(void*) >= sizeof(unsigned));
*(unsigned*)&p = 17; // (1)
memcpy(&p, &x, sizeof(x)); // (2)
Строка 1 нарушает правила псевдонимов. Строка 2, однако, в порядке. правила псевдонимов. Вопрос в том, почему? Имеет ли компилятор специальные встроенные знания о таких функциях, как memcpy, или существуют ли другие правила, которые делают memcpy ОК? Есть ли способ реализации memcpy-подобных функций в стандарте C без нарушения правил псевдонимов?