Может ли изгнание constness привести к поведению undefined?

const int a = 10
int *p = (int*) &a;
*p = 20;
printf("a = %d", a);

Можно ли выводить либо 10, либо 20, в зависимости от компилятора?

Ответ 1

Можно ли выводить либо 10, либо 20, в зависимости от компилятора?

Да, или даже носовые демоны могут появиться. Поведение этой программы undefined,, код плохо сформирован, потому что изменение объекта const является нарушением ограничения.

Ответ 2

Как написано, ваш код имеет поведение undefined, так что да, вы могли бы получить 10 или 20 или что-нибудь еще (например, нарушение прав доступа).

Ответ 3

Это поведение undefined:

C11 6.7.3 Типовые классификаторы

Если предпринимается попытка изменить объект, определенный с помощью типа const, используя lvalue с неконстантно-квалифицированным типом, поведение undefined. Если попытка чтобы ссылаться на объект, определенный с помощью нестабильного типа, посредством использования значения lvalue с типом энергонезависимого типа, поведение undefined.

Ответ 4

Да, это поведение undefined, и я думаю, что это то, что говорит об этом.

C99 Раздел 6.7.3 Пункт 5

Если делается попытка изменить объект, определенный с помощью const-квалифицированный тип с использованием lvalue с неконстантно-квалифицированными тип, поведение undefined. Если делается попытка сослаться на объект, определенный с помощью нестабильного типа, с использованием значения lvalue с типом энергонезависимого типа, поведение undefined.115)

Ответ 5

Когда вы выполняете *p=20, вы пытаетесь изменить значение константы, что не разрешено.