Стандарт говорит:
(6.7.3) Если предпринята попытка изменить объект
определяется с помощью const-квалифицированного типа посредством использования lvalue с
неконстантный тип, поведение не определено.
А в разделе неопределенного поведения:
Предпринята попытка изменить объект, определенный с
квалифицированный const тип с использованием lvalue с
неконстантный тип (6.7.3)
Возвращаемое значение malloc является блоком неинициализированного хранилища . В этом хранилище не было построено объекта .
Тем не менее, приведенный ниже код является законным?
#include
#include
typedef struct {
unsigned char h;
const unsigned int v;
} liber_primus;
int main(int argc, const char **argv)
{
unsigned int lykilord;
if (!(argc - 1))
return 0;
liber_primus *runaljod = malloc(sizeof (*runaljod));
if (!runaljod)
abort();
runaljod->h = *(unsigned char *)argv[1];
*(unsigned int *)&runaljod->v = 3307U;
lykilord = runaljod->h * runaljod->v;
free(runaljod);
return lykilord;
}