1

私はCで書かれた関数を持っています

FindBeginKey(KeyListTraverser, BeginPage, BeginKey, key1);

BeginKeyは関数を呼び出す前のポインターであり、私はそれを開始しませんでした。

BeginKey = NULL;

FindBeginKey()関数内で別のポインターを割り当て、関数内BeginKeyのの現在のアドレスを出力しようとすると、BeginKey正しく機能します。BeginKeyしかし、コードが関数から戻ると、のアドレスをもう一度出力しようとすると、が表示されます0x0

なぜこれが発生するのですか?関数で割り当てられたアドレスを保持したい場合はどうすればよいですか?

4

4 に答える 4

0

サブルーチン内のパラメーターを変更する場合は、変更するもののポインターを渡す必要があります。

void subroutine(int* x) {
   *x = 5;   // will modify the variable which x points to

   x = 5;  // INVALID! x is a pointer, not an integer
}
于 2013-02-17T17:43:51.193 に答える
0

私が理解していることから、あなたは次のような関数を呼び出しています。

FindBeginKey(KeyListTraverser, BeginPage, BeginKey, key1);

ただし、BeginKeyアドレスに書き込もうとすると、基本的に0x00へのポインターが渡されます。むしろ、BeginKeyへのポインタを渡す必要があります。

FindBeginKey(KeyListTraverser, BeginPage, &BeginKey, key1);

これが意図したものではない場合は、コードサンプルを投稿すると確かに役立ちます。

于 2013-02-17T17:41:20.810 に答える
0

関数から値を渡すには、C関数の場合のようにではなく、参照によって渡す必要があります。これを行うには、パラメーターを、渡すタイプへのポインターにします。次に、 (アドレスオペランド)を使用して値を呼び出しに渡します。&

例えば

FindFoo(FOO** BeginKey);

そしてそれを呼びます:

FindFoo(&BeginKey);

および関数内:

*BeginKey = 0xDEADC0DE;
于 2013-02-17T17:41:22.857 に答える
0

現在、すべてのCパラメーター受け渡しルールが何であるかわからないため、この回答は少し古くなっている可能性があります。アプリケーションとそれらのアプリケーションが呼び出すライブラリを構築する一般的な方法から、C関数からの戻り値にはステータスが含まれるため、関数の呼び出し元はステータスコードに応じて決定を下すことができます。

関数に入力パラメーターを変更させたい場合は、参照によってそれらのパラメーターを渡します。&my_valここで、int my_val;*my_valまた、関数は、その値を取得するために、このようにmy_valを逆参照する必要があります。

また、パフォーマンス上の理由から、アプリケーションがパラメータの値をローカル変数にコピーすることを気にしないように、アドレス(参照による)が望ましい場合があります。そのプロローグコードはコンパイラによって生成されます。単一のパラメーター、char、intなどはかなり単純です。

私はC++に慣れているので、C++での参照渡しは間接参照を必要としません。コンパイラのコードがそれを処理します。

ただし、構造体へのポインターを渡すことを検討してください。

struct my_struct  
{                    
  int iType;
  char szName[100];
} struct1;

struct my_struct *pStruct1 = &struct1;

構造体に、初期化時に一度入力され、プログラム全体で参照されるルックアップデータが含まれている場合は、値で構造体へのポインターを渡しますpStruct1。その構造を埋めたり、既存のデータを変更したりする関数を作成している場合は、値で構造へのポインターを渡します。それでも、構造体ポインタが指すものを変更することができます。

一方、ポインタにメモリを割り当てる関数を記述している場合は、ポインタのアドレス(ポインタへのポインタ)を渡すと、ポインタ&pStruct1が正しいメモリを指すようになります。

于 2013-02-17T18:21:49.253 に答える