2016-10-29 9 views
-3

私はconstとして宣言していますが、私の質問はなぜ変数の値を変更するのですか?申し訳ありませんが、これは簡単な質問です。Constはconstではありませんか?

const int a = 8; 
int* ptr = &a; 

printf("variable: %d \n", a); 
printf("pointer: %d \n", *ptr); 

*ptr = 1; 
printf("pointer: %d \n", *ptr); 
printf("variable: %d \n", a); 

は、出力:8 8 1 1

おかげで、良い一日を!

+0

だから、あなたは**あなたが契約を破る**あなた**保証されている場合、コードが暴動する理由を尋ねる?しかし、あなたのコンパイラは警告していたはずです。注:Cには_enum-constants_以外の記号定数はありません。 – Olaf

+0

一般に、C言語標準では 'ポインタをconstに'から 'ポインタを非constに'キャストすることができるため、実行時のプログラムの正確な動作は未定義です。具体的には、このプログラムの実行時の動作はコンパイラに依存します。コンパイラが実行可能イメージの読み取り専用セグメントにconst変数を割り当てると、 '* ptr = 1'行が実行されるとメモリアクセス違反(別名*セグメンテーションフォールト*)が発生します。実行可能イメージの読み取り/書き込みセグメントにそれらを割り当てると、この行は正常に実行されます。 –

答えて

0

あなたはconstとしてaを認定しているが、あなたはポインタにそのアドレスを割り当てるときに、これはconstaの効果は今ptrを使用して簡単に操作することができます破棄します。これは、未定義の動作を引き起こす可能性が最も高いです。あなたは、この効果を体験定数へのポインタとしてポインタ変数を宣言しないようにしたい場合は

warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] 
     int* const ptr = &a; 

:あなたはあなたのプログラムをコンパイルするとき

GCCは警告が表示されます。 例:const int* ptr=&a;

+0

なぜdownvote? – skrtbhtngr

+0

驚き!あなたの答えは正しいです。あなたはこの動作が未定義であると言うべきでしょう... –

+0

はい最初に投稿した後に編集しました。 – skrtbhtngr

関連する問題