2016-09-18 5 views
-1

私は以下のようにconst void*といくつかのコードを持っている:const void *がCでまだ更新されているのはなぜですか?

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

int main() 
{ 

    const int p = 10; 

    char s[] ="I am newbie"; 

    const void *vp; 
    vp = &p; 

    *(int*)vp = 11; 
    printf("%i\n", *(int*)vp); 

    vp= s; 
    printf("%s\n", (char*)vp); 

    return 0; 
} 

const void* vpがまだ更新され、なぜ私の質問はありますか? 私の理解として、const変数は直接更新することはできませんが、それはすべての型に対して正しいのでしょうか?

+0

中間のvoidポインタを使うと、 '*(int *)&p = 11;と比較しても全く違いはありません。 –

答えて

2

あなたが効果的にあなたのintへのポインタを得たとき、const削除constずに何かにポインタをキャストした後、どのようなそのポイントの値を変更しました。

*(int*)vp = 11; 

他のポインタ型にキャストできます。

constこのような変数を変更することは、未定義の動作です。例えば、コンパイラは、変数がconstであることを見て、printf関数が何を出力するかを事前に計算し、最適化としてコンパイル時に代入を行うことができることに気づいたかもしれません。変数がconstだと思うので、コンパイラはこれを行うことが許されます。

+0

constへのポインタについても触れてください。とにかく、constを変更するときに未定義の動作について言及するために+1します。 –

関連する問題