2016-07-25 4 views
-5

は、私は次のコードをしている:私は使用して機能Cの引数の値は不変ですか?

void func(uint8 *var) { 
    uint8 tempvar; 

    if (var) 
     var = &tempvar; 

    *var = 0; 
} 

を呼び出します。コードはラインでセグメンテーションフォールトを与える

func(NULL); 

を "* VAR = 0;"なぜなら、varはメモリアドレス0x0を指しているからです。一時変数への代入がうまくいかなかった理由は分かりません。

+3

"なぜ私の一時変数への割り当てが機能しませんでしたか"。なぜなら、 'var'がもともとはnullだった場合、その割り当てをスキップするようにプログラムに明示的に依頼したからです。あなたの 'if'条件はそれを正確に示しています。 – AnT

+0

@πάνταῥεῖ - それはスコープ内のローカル変数です。スコープ内でのみ使用しています。パラメータは単一のポインタであり、アドレスの変更は呼び出し元変数を変更しません。したがって、その範囲外でアクセスされる変数はありません。 –

+0

既に持っています... –

答えて

7

!を省略したためです。あなたは変数が存在するかどうかをテストしているが、あなたがそれかどうかをテストする必要がありは存在しません:if (!var) ...

をビットさらに拡大するには... varはタイプuint8 *であり、これVAR自体がポインタです。 if (var)を書くことによって、そのポインタがNULLでないかどうかをテストします。

if (the var pointer already exists) 
    assign a new pointer to it (make it point to somewhere else) 

をしかし、(それがNULLを指している場合)が存在しない場合、あなたは一人でそれを残す:擬似コードでは、あなたのコードは述べています。これは、デバッガまたは単純なprint文を使用して検証できます。したがって、あなたはヌルポインタで代入され、プログラムがクラッシュします。

+0

if(var == NULL)に相当するif(var == 0)に(var)が変換されないのですか? –

+5

'if(...)'が何かが真であるかどうかのテストです。 0(NULL)の値はfalseに昇格します。他のすべての値はtrueになります。とにかく、それを試してみてください! –

+0

@ H.Guijt(NULL)が偽である場合、これは確かな理由ではありません。 –

関連する問題