const int a = 10
int *p = (int*) &a;
*p = 20;
printf("a = %d", a);
コンパイラによっては、10 または 20 のいずれかを出力できますか?
コンパイラによっては、10 または 20 のいずれかを出力できますか?
はい、または鼻の悪魔でさえ現れる可能性があります。オブジェクトの変更は制約違反であるため、このプログラムの動作は定義されておらず、コードの形式が正しくありません。const
書かれているように、コードには未定義の動作があるため、そうです、10 または 20 またはその他のもの (アクセス違反など) が返される可能性があります。
これは未定義の動作です:
C11 6.7.3 型修飾子
const 修飾されていない型の左辺値を使用して、const 修飾された型で定義されたオブジェクトを変更しようとした場合、動作は未定義です。volatile 修飾されていない型の左辺値を使用して、volatile 修飾された型で定義されたオブジェクトを参照しようとした場合、動作は未定義です。
はい、それは未定義の動作であり、これがそれについて語っている場所だと思います。
C99 セクション 6.7.3 パラグラフ 5
const 修飾されていない型の左辺値を使用して、const 修飾された型で定義されたオブジェクトを変更しようとすると、動作は undefined になります。volatile 修飾されていない型の左辺値を使用して、volatile 修飾された型で定義されたオブジェクトを参照しようとした場合、動作は未定義です.115)
を実行する*p=20
と、許可されていない定数の値を変更しようとしています。