Можно ли выделить память, которой достаточно для размещения только определенного члена объединения?
Да.Тем не менее, код не должен пытаться использовать элементы в нераспределенных частях.
Для ясности ниже используется union ab
вместо union u
.
Начальная часть кода: нетпроблемы.
#include <stdio.h>
#include <string.h>
#include <malloc.h>
union ab;
union ab {
int a;
long b[4096];
};
int main(){
union ab tmp = {.a = 42};
Назначение указателя на ограниченную память не является проблемой для себя.Хотя для приведения типов нет необходимости, и я считаю, что распределение по размеру объекта / члена более информативно (легче кодировать, просматривать и поддерживать), чем распределение по размеру типа.
// union ab *u = (union ab*) malloc(sizeof(int)); //not malloc(sizeof(union ab))
union ab *u = malloc(sizeof u->a);
С копированием / назначением проблем нет, так как памяти, на которую указывает u
, достаточно.
memcpy(u, &tmp, sizeof(int));
// or
u.a = tmp.a;
Печать - проблема, так как код использует несовпадающий спецификатор,В исправленном коде нет проблем при доступе к члену .a
// printf("ab::a = %lu\n", u -> a);
printf("ab::a = %d\n", u->a);
Пока проблем нет.
Некоторый новый код является проблемой, поскольку код пытается прочитать через u
,вне выделенной памяти - это неопределенное поведение (UB).
temp = *u;
}