Для функции malloc
, параграф 6.5 §6 проясняет, что невозможно написать совместимую и переносимую реализацию C:
Эффективный тип объекта для доступа кего сохраненным значением является объявленный тип объекта, если таковой имеется (87) ...
(ненормативное) примечание 87 гласит:
Выделенные объекты не имеют объявленного типа.
Единственный способ объявить объект без объявленного типа - это ... через функцию выделения, которая требуется для возврата такого объекта!Таким образом, внутри функции выделения у вас должно быть что-то , которое не может быть разрешено стандартом для установки зоны памяти без объявленного типа.
В общих реализациях стандартная библиотека malloc и freeдействительно реализовано в C, но система знает об этом и предполагает, что массив символов, предоставленный внутри malloc
, просто не имеет объявленного типа.Полная остановка.
Но оставшаяся часть того же абзаца объясняет, что нет реальной проблемы в написании реализации memcpy
(подчеркните мою):
... Еслизначение сохраняется в объекте, у которого нет объявленного типа, через lvalue, имеющий тип, который не является символьным типом, тогда тип lvalue становится эффективным типом объекта для этого доступа и для последующих доступов, которые не изменяют сохраненное значение,Если значение копируется в объект, не имеющий объявленного типа, с использованием memcpy или memmove или копируется как массив символьного типа , то эффективный тип измененного объекта для этого доступа и для последующих обращений, которые делаютНе изменять значение - это эффективный тип объекта, из которого копируется значение, если оно есть.Для всех других обращений к объекту, у которого нет объявленного типа, эффективным типом объекта является просто тип lvalue, используемого для доступа.
При условии, что вы копируете объект как массив символьного типа, который является специальным доступом, разрешенным согласно строгому правилу псевдонимов, нет проблем с реализацией memcpy
, и ваш код является возможной и действительной реализацией.
ИМХО, разглагольствование Говарда Чу о том старом добреmemcpy
использование, которое больше не действует (при условии sizeof(float) == sizeof(int)
):
float f = 1.0;
int i;
memcpy(&i, &f, sizeof(int)); // valid: copy at byte level, but the value of i is undefined
print("Repr of %f is %x\n", i, i); // UB: i cannot be accessed as a float