4

重複の可能性:
C の定数とポインター

この小さなコードがあります。私はgccコンパイラを使用しています:

#include <stdio.h>

int main()
{
    const int a=10;
    int *d;
    d=&a;
    *d=30;
    printf("%d %d\n",a,*d);
    return 0;
}

コンパイル時に警告が表示されます。

「割り当ては、ポインター ターゲット型から修飾子を破棄します」

しかし、エラーはありません。出力は次のとおりです: 30 30

それでは、プログラムの実行中に値が固定されている const 変数を維持するという目的に反していませんか (間違っている場合は修正してください)。

4

3 に答える 3

4

const保証ではありません。それはただの約束です。約束は破られる可能性があります。コンパイラはこれが発生すると警告しますが、それ以外の場合は、定数をバイパスすると便利な場合があるため、これを防ぐ必要はありません。

于 2012-11-03T18:46:03.053 に答える
2

上記の動作は未定義です。この例が示すように異なる値も取得できます。この出力の説明は次のとおりです。コンパイラはコードを最適化し、const 変数をその値に置き換えます。printf("%d %d %u %u\n",a,*d,&a,d);したがって、実際には次のように最適化するように変更されたはずの違いを見ることができます。printf("%d %d %u %u\n",10,*d,&a,d);

これらの出力に依存しないでください。実際の動作は標準では定義されていません。

于 2012-11-03T20:05:08.313 に答える
0

それを行うべきではなく、コンパイラは理由でその警告を出しています。ただし、C/C++ を使用すると、必要なことは何でも実行できます。きれいなコードを書くのはあなた次第です。

以下を使用して、その値の定数を反映できます。

int const * d =  &a;    

次に、d が指すものを変更すると、警告とエラーが生成されます。

于 2012-11-03T18:52:21.203 に答える