2011-06-29 3 views
-2

私は今知っていることの一つです。質問はCのconst修飾子についてです。私のプログラムでは、const修飾子で定義された変数の値を変更したいと思います。例えばcのconst修飾子で定義された変数の値を変更する方法はありますか?

int main() 
{ 
const int i=40; 
i=50 ; // error 
} 

しかし、私はそれを知っている上記example.Pleaseにiの値を変更するにはどのような方法があります。 ありがとうございます

+0

"const修飾子で定義された変数の値を変更したい"あなたが 'const'の目的を理解できないように思えるかもしれません。 –

+3

私の一部が亡くなりました。 – Dair

+0

@James McNellis:Cは、 'const'修飾子で変数を定義しなければならない場合がありますが、値を代入することはできません(自己参照ポインタを含む複雑なデータ構造など)。変数を 'const'にする必要がありますが、あなたはスタックされています... –

答えて

5

まず、ではありません。

第二に、あなたはそのアドレスを取得し、それを参照してしなければならないとしたらできそう:

第三
const int i = 40; 
*(int*)&i = 50; 
// i is now 50 

、これを行うにしないでくださいしてください。

編集:他の人が指摘しているように、これは未定義の動作を示します。コンパイラは、この値をアドレス指定可能な場所に格納することを前提としています。 (定数はその即値で置き換えることができ、 "それのアドレスを取る"ことは何の意味もありません)あなたは警告されました。

+0

これはCまたは実装の詳細で「明確に定義されていますか? –

+0

私の心は吹かれた –

+0

これらの答えは私が何も知らないように感じさせる。 – Dair

7

動作が明確に定義されているプログラムでは、iは変更できません。はっきり

C99§6.7.3(「型修飾子」)/ 5の状態:

試みは非と左辺値の使用 てconst修飾型で定義オブジェクトを変更するためになされた場合-const-qualified型の場合、動作は定義されていません。

iは、const修飾型(const int)で定義されたオブジェクトです。これは変更不可能な左辺値です。const修飾されているため、変更できません。それを変更する唯一の方法は、プログラムが未定義の挙動を示す原因となるconst修飾を削除するためにキャストを使用することです。

4

2つの方法があります。

まずはあなたが興味を持っていない方法です。標準ではこれが可能ですが、おそらくあなたはそれを制御できないので、本当に興味がありません。標準では、実装が指されているものを変えるかもしれない(例えば、それはタイマーであるかもしれない)が、あなたはそれを変更してプログラムを禁止することができますので、あなたが

const volatile int *pSomething; 

のようなものを定義することができると言います。

第2の方法は興味がありますが、標準では許可していません。ヤンはすでにこのような答えを出しました。

*(int*)&i 

は、変更可能な左辺値の規則に従って変更可能な左辺値です。ただし、実際にこのlvalueを変更しようとすると、実際のオブジェクトiがconstとして定義されているため、標準に違反します。結果は未定義の動作です。実装はあなたが望むことをするかもしれません、または私は変わっていないかもしれません、あなたのプログラムを中止するかもしれないか、またはあなたのハードドライブをフォーマットするかもしれません。

あなたがしたいことをやり遂げる方法です。

int theRealI; 
const int *pTheRealI = &theRealI; 
#define i (*pTheRealI) 

私は読み取り専用になりますが、リアルを変更したい場合は可能です。

関連する問題