void *pnt = malloc(sizeof(struct test1));
Какой тип памяти имеет указатель pnt?Нет типа.Он неинициализирован (его значение «неопределенное»).Есть только «память».
Тогда вы делаете:
struct test1* aQuickTest = malloc(sizeof(struct test1));
Вы только наведите указатель.Здесь ничего не происходит.Сборка не создается.Чтение неинициализированной памяти является неопределенным поведением, поэтому вы не можете читать из aQuickTest->a
(пока).Но вы можете назначить:
aQuickTest->a = 1;
Это записывает объект struct test1
в памяти.Это задание.Теперь вы можете прочитать aQuickTest->a
, т.е.выведите его.
Но следующее
printf("%d", ((struct test2*)aQuickTest)->a);
- неопределенное поведение (хотя оно будет / должно работать).Вы получаете доступ к базовому объекту (т.е. struct test1
), используя несовпадающий тип указателя struct test2*
.Это называется "строгое нарушение псевдонима".Разыменование объекта (т. Е. Выполнение ->
или *
) с использованием дескриптора не совместимого типа приводит к неопределенному поведению.Неважно, что struct test1
и struct test2
«выглядят одинаково».Они разного типа.Правило соответствует стандарту C11 6.5p7 .
В первом фрагменте кода происходит неопределенное поведение внутри printf("Int: %i Char: %c",value->c
.Доступ value->
обращается к основной памяти с помощью несовместимого дескриптора.
Во втором фрагменте кода переменная temp
является только указателем.Также original
является указателем.Выполнение memcpy(&temp, &original, sizeof(struct test2));
недопустимо, потому что &temp
записывает в указатель temp
и &original
записывает в original pointer. No to the memory behind pointers. As you write out of bounds into
& temp pointer and read of bounds from
& original pointer (because most probably
sizeof (temp) and sizeof(оригинал)
В любом случае, даже если бы это было:
struct test1* original = &(some valid struct test1 object).
struct test2 temp;
memcpy(&temp, original, sizeof(struct test2));
printf("%d", temp.a); // undefined behavior
доступ к памяти за переменной temp
все еще недействителен.Поскольку у original
не было struct test2
объекта, он все еще недействителен.memcpy
не меняет тип объекта в памяти.