Может ли изгнание 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, вы пытаетесь изменить значение константы, что не разрешено.