2016-04-02 9 views
-2

に等しい((文字**)*ん、私が持っている表現に何が起こるポインタを理解する。 ?</p> <pre><code>char *p, *q; p = malloc(1); //for the purpose testing only p[0] = '!'; q = *((char **)p); printf("p=%x q=%xn", p, q); printf("p=%c q=%cn", p, q); </code></pre> <p>何の鋳造の警告がなかった、と出力は次のようになります:どのようなCで

p=1a9008 q=21 
p q=! 

qに割り当てられ、すなわち*((char **)p)割り当て後に変更qの型を持つ


編集:?errがありますまたは私のコードで。私は完全に動作する例に遭遇したコード断片からそれを掘り下げようとしていましたが、pのchar型の値の例を誤って使用しました。元のコードをさらに調べた後、pにポインタ値が割り当てられました。だから、pはポインタへのポインタです。

+0

プログラマーがキャストを使用しているとき、彼らは通常、何か間違っています。 –

+7

その行は基本的にナンセンスです。**は未定義の動作**を呼び出します。 –

+0

ありがとうございます。私が見つけたいくつかのコードで、それが何をしているのか把握しようとしていました。 (私はC.の初心者です) –

答えて

2

まず、変数の型は変更できません。char* qと宣言されている場合、その型はchar*です。

変数の値を変更することはできますが、状況によってはコードが間違っているだけです。

まずpcharへのポインタとして宣言され、あなたはそう、char**検討するpを強制キャストを通じて、その後

p = 0xDEADBEEF 
     | 
     ---> '!' 

のようなものを持っていますので、単一バイトがmalloc関数によって割り当てられ、 char型へのポインタへのポインタ、何が起こるかはコンパイラが

p = 0xDEADBEEF 
     | 
     -----> 0x??????21 
        | 
        --------> char 

だから基本的に手動で割り当てられたメモリとassigを強要されて考えることを余儀なくされていることですメモリアドレスとして解釈される場合は、*(char**)char*0x??????21)となるので、意味をなさない。

+0

'' char * '以外の文字列を 'char *'とみなそうとすると、bat(厳密なエイリアシング規則)からすぐに未定義の動作が起こります。コンパイラはアドレスを作ってそれに従うように強制されません。これは実際の 'char *'にアクセスするのと同じアセンブリを生成するコンパイラのアーティファクトに過ぎず、 'char * '以外の場合はこれをしないと仮定します。 –

関連する問題