はい、ちょっとしたハックでそれを行うことができます。
#include <stdio.h>
int main(){
const int a = 0;
*(int *)&a = 39;
printf("%d", a);
}
上記のコードでa
は、const int
です。少しハックすると、定数値を変更できます。
更新: 説明
上記のコードでは、 a は a として定義されていconst
ます。たとえば、 a にはメモリ addr がある0x01
ため&a
、同じものを返します。キャストすると(int *)
、constへのポインターと呼ばれる別の変数になります。再度アクセスすると*
、元の変数ではないので const ポリシーに違反せずに別の変数にアクセスできますが、ポインタへのアドレスとして参照されるため、変更が反映されます。
これは、Borland C++ や Turbo C++ などの古いバージョンでも機能しますが、現在は誰も使用していません。
これは「未定義の動作」です。つまり、これを試したときに何が起こるかを標準に基づいて予測することはできません。特定のマシン、コンパイラ、およびプログラムの状態に応じて、さまざまなことを行う場合があります。
この場合、ほとんどの場合、答えは「はい」になります。変数は、const であろうとなかろうと、単なるメモリ内の場所であり、const のルールを破って単純に上書きすることができます。(もちろん、プログラムの他の部分が const データが定数であることに依存している場合、これは重大なバグを引き起こします!)
ただし、場合によっては (最も一般的には const 静的データの場合)、コンパイラはそのような変数をメモリの読み取り専用領域に配置することがあります。たとえば、MSVC は通常、実行可能ファイルの .text セグメントに const static int を配置します。これは、書き込みを試みると、オペレーティング システムが保護違反をスローし、プログラムがクラッシュすることを意味します。
コンパイラとマシンの他の組み合わせでは、まったく異なることが起こる可能性があります。確実に予測できることの 1 つは、このパターンは、コードを読まなければならない人を悩ませることです。
これを試して、私に知らせてください。