0

たとえば、void**p2変数を作成しました

int x = 10;
void* p = &x;
void** p2 = &p;

これは関数で作成されます。パラメータまたは戻り値を使用して、p2と*p2の両方が正確な値を保持するようにこのp2を渡すにはどうすればよいですか。私は解決策を見つけることに成功しませんでした。簡単な例を教えてください。

たぶん、いくつかの詳細が役立つかもしれません:

class ShmItem
{
public:
    void* start;
    void** vtable;
};

このクラスはグローバルであり、グローバルベクトルの一部です。今私の機能で。

item.vtable = &item.start;
shm->address = item.vtable;

ここで、itemstartはmmapの戻り値を保持します。

shmは、アドレスがvoid**型のパラメータオブジェクトです。

今、私が発信者に戻ったとき、item.start変化の値は(でshm->address)...

申し訳ありませんが、ポインタとは関係のないバグを見つけました。このスレッドを削除できますか?質問はもう意味がないからです。(関数呼び出し間でダブルポインターを渡すCarlosの方法は私を助けた良いアイデアですが、私はそれを回答済みとしてマークしました)。

4

2 に答える 2

0

ローカル変数のアドレスを取得して、意味のある方法で関数から返すことはできません。これは、関数が戻るまでにローカル変数がスコープ外になるためです。

次のコードでは、xとの両方pが関数本体に対してローカルです。

void foo()
{
    int x = 10;
    void * p = &x;
}

渡すことができる唯一の適切なポインターは、関数が戻るまでにまだ存在するオブジェクトへのポインターです。つまり、グローバルオブジェクト、または動的に割り当てられたオブジェクト、または最初に関数に既に渡さたオブジェクトのいずれかです (たとえば、 C、または C++ の参照によって)。

于 2012-10-30T18:18:13.560 に答える
0

私はあなたがCを使っていると仮定していますよね?ですから、あなたは2つのことをする必要があると思います。まず、関数の外側で double ポインター変数を宣言して、関数が戻った後にスコープ内にあるようにします。次に、次のように、必要な値を保持する void ** パラメータを受け取って返すように関数を宣言します。

void **myfunc (void **p2) {
    int x = 10;
    void* p = &x;
    p2 = &p;  // notice var declaration is gone
    ...
    return p2;
}
void ** p2;
p2 = myfunc(p2);

void を返すように myfunc を宣言し、代入コンストラクトなしで p2 を指定して myfunc を呼び出すこともできます。

于 2012-10-30T18:19:03.357 に答える