0

メソッド内のポインターで操作を行うと、機能します。しかし、別のメソッドで引数として使用すると、同じ操作は失敗します。明らかに欠けているものがあります。私の推測では、何らかの理由で foobar が *ptr が指している変数を「見る」ことができないということです。

int main(int argc, char *argv[]){
    unsigned short b =15;
    unsigned short *ptr = &b;

    //If I do it in main it works
    unsigned short c = 10 & (*ptr);

    //If I send it to foobar, it segfaults
    foobar(*ptr);
}

void foobar(unsigned short *ptr){
    unsigned short c = 10 & (*ptr);
}

foob​​ar(unsigned short b) をコンパイルしない場合、変数を foobar に渡すにはどうすればよいですか (試行錯誤の結果、基本型しか引数として使用できないことがわかりました)。

誰かが私に説明を「指摘」できれば、私は感謝します。C のチュートリアルをいくつか読みましたが、これが発生する具体的な理由や解決方法がわかりません。

ありがとう

4

4 に答える 4

2

ここ

 foobar(*ptr);

逆参照されたポインターを関数に送信しています。したがって、unsigned short へのポインタではなく、unsigned short 引数を渡しています。この関数はポインターを想定しているため、ポインターを渡す必要があります。必要なのは

 foobar(ptr);

そしてあなたのコードはコンパイルされます

于 2012-07-28T09:09:23.987 に答える
1

ではなくptrに渡す必要があります。foobar*ptr

于 2012-07-28T09:08:07.090 に答える
1

これは、ptr に格納されている b のアドレスではなく、b の値を渡しているために発生します。つまり、foobar は有効なアドレスではない ptr = 10 を取得しています。( unsigned short c = 10 & (*ptr);) 内で逆参照すると、segfault が発生します。

ポインタを foobar 関数に渡すだけでよいようです。これは次の方法で実現できますfoobar(ptr);

于 2012-07-28T09:10:43.950 に答える
0

foobarへのポインタunsigned shortが必要です。ただし、引数リストで逆unsigned short参照するときにを渡すと、アドレスとして取得されます。アドレスとして使用すると、本体である単一行で逆参照されます-セグメンテーション違反が発生します。ptrfoobar(*ptr);foobar1010foobar

so: のようにポインターを渡して関数を呼び出すfoobar(ptr);と、 のステートメントで行ったように値を使用できますmain

于 2012-07-28T09:10:52.903 に答える