6

constgccで変更された変数の値を変更することはできますが、他のコンパイラでは変更できません。iこのコードをgccで試しました。これにより、 and j(11)の値が更新されます。オンラインコンパイラでは、さまざまな値を取得します。

#include<stdio.h>
void main() {
  const int i=10;
  int *j;
  j = &i;
  (*j)++;
  printf("address of j is %p address of i is %p\n",j,&i);
  printf("i is %d and j is %d\n",i,*j);
}
4

5 に答える 5

19

はい、ちょっとしたハックでそれを行うことができます。

#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 つは、このパターンは、コードを読まなければならない人を悩ませることです。

これを試して、私に知らせてください。

于 2015-07-23T09:35:20.190 に答える
9

const変数の値を変更するには?

いいえ!const変数を変更しないでください。
変数を持つことの要点は、constそれを変更できないことです。変更できる変数が必要な場合は、const修飾子を追加しないでください。

const(ポインター) ハッカーを介して強制的に変更するコードは、 Undefined Behaviorを呼び出します。

未定義の動作は、コードが C 標準によって定められた標準仕様に準拠していないため、有効なコードではないことを意味します。このようなコードは、任意の動作を示すことができ、それが許可されています。

于 2012-08-24T07:27:48.930 に答える
7

iとして定義することによりconst、変更しないことを約束しました。コンパイラーはそのpromiseに依存し、変更されていないと想定できます。の値をi出力すると、コンパイラは、10現在格納されている値をロードするのではなく、単に出力できiます。

または、値をロードすることを選択できます。または、を変更しようとするとプログラムがクラッシュする可能性がありますi。動作は未定義です。

-O1最適化オプション( 、 )に応じて、gccで異なる動作が見られる可能性があります-O3

ああ、それvoid main()は正しくありません。する必要がありますint main(void)。教科書に使用するように書かれvoid main()ている場合は、より良い本を入手する必要があります。

于 2012-08-24T07:35:35.537 に答える
2

constで定義されたオブジェクトの値をポインタで変更できますか?を見てください。

簡単に言えば、それはundefined behaviourです。コンパイラ/マシンに依存する結果になる可能性があります。

于 2012-08-24T07:35:28.517 に答える