7

重複の可能性:
邪悪なキャストは邪悪なコンパイラーによって打ち負かされますか?

こんにちは、

ポインタを介して定数を変更できる場合、その目的は何ですか?以下はコードです:

#include <stdio.h>
#include <stdlib.h>

int main()
{
 const int a = 10;
 int *p = (int *)&a;

 printf("Before: %d \n", a);
 *p = 2;
 /*a = 2; gives error*/

 printf("After: %d \n", *p);

 return 0;
}

出力:

前:10
後:2
任意のキーを押して続行します。。。

VisualStudio2008を使用します。

4

2 に答える 2

12

値を変更できる理由は、本質を取り除いたポインター型キャストを実行したためですconst

int *p = (int *)&a;

const int*これにより、 (つまり&a)がにタイプキャストされint *、変数を自由に変更できるようになります。通常、コンパイラはこれについて警告しますが、明示的な型キャストは警告を抑制しました。

背後constにある主な理由は、あなたが約束していないものを誤って変更することを防ぐことです。constこれまで見てきたように、それは神聖なものではなく、ポインタを整数に変換したり、その逆を行ったりするなど、他の危険なことを行うのとほぼ同じ方法で、不処罰で不処罰を捨てることができます。アイデアは、あなたが混乱しないように最善を尽くすべきであるということですconst、そしてあなたがそうするならば、コンパイラはあなたに警告します。もちろん、キャストを追加すると、コンパイラに「自分が何をしているのかわかっている」と通知されるため、上記の場合、警告は生成されません。

于 2011-01-30T06:00:34.207 に答える
9

ポインタを介して定数を変更できる場合、その目的は何ですか?以下はコードです:

これは未定義動作であり、絶対に避ける必要があります。

§C996.7.3p5 _

非const修飾型の左辺値を使用して、const修飾型で定義されたオブジェクトを変更しようとすると、動作は未定義になります。

于 2011-01-30T06:00:46.303 に答える