2

私はC ++が初めてです。私はすべてを試しましたが、私の問題を解決できませんでした。背景として、暗号化に Botan ライブラリを使用しています。この問題はライブラリとは何の関係もないと思いますが、ポインターとオブジェクトに関係があると思います。

次のコードを使用すると、問題はありません。各行の後のコメントは、何が起こるかを説明しています。(コードは説明のみを目的としています)

int main(int argc, char** argv)
{
    DH_PrivateKey *Apriv = 0; // Apriv points to 0x00
    MemoryVector<unsigned char> *Apub = 0; // Irrelevant for now
    AutoSeeded_RNG rng; // Irrelevant object
    DL_Group domain("modp/ietf/3072"); // Irrelevant object
    Apriv = new DH_PrivateKey(rng,domain); // Apriv points to 0x8079098

ここでの主な観察は、オブジェクトがインスタンス化され、Apriv がそのオブジェクトを指していることです。これが私がしたいことです。Apriv ポインターを渡す別の関数でこれを実行しようとすると、問題が発生します。

私のメインコードは次のように変更されます。

int main(int argc, char** argv)
{   
    DH_PrivateKey *Apriv = 0;
    MemoryVector<unsigned char> *Apub = 0;
    AutoSeeded_RNG rng;
    DL_Group domain("modp/ietf/3072");
    encryption::dh_generatekeys("modp/ietf/3072",Apriv,Apub); //Passing pointers

そして、これらのポインターを渡す関数は次のようになります。

void encryptionalgorithm::dh_generatekeys(string shareddomain,DH_PrivateKey *privatekey,MemoryVector<unsigned char> *publickey)
{
    AutoSeeded_RNG rng; // Irrelevant
    DL_Group shared_domain(shareddomain); // Irrelevant
    privatekey = new DH_PrivateKey(rng, shared_domain); //[PROBLEM 1]
    MemoryVector<unsigned char> pubkey = privatekey->public_value();
    publickey = &pubkey;[PROBLEM 2]

次に、問題について説明します。

問題 1: 秘密鍵ポインターは依然として 0x00 を指しており、新しくインスタンス化されたオブジェクトを指していないため、後でセグメンテーション エラーが発生します。問題 2: publickey についても同様です。スタック上に「pubkey」を作成し、publickey ポインターをそのアドレスにポイントすると、publickey は 0x00 のままになります。

どんな助けでも大歓迎です。それが簡単なものであることを願っています!

みんなありがとう。

4

4 に答える 4

4

パラメータは値で渡されます。

つまり、関数内のポインターの値を変更する場合は、privatekeyその関数のローカル変数のみを変更します。

代わりに、パラメーターを参照として受け入れるように関数のシグネチャを変更することをお勧めします。

void generatekeys(Something *& Apub, Something *& Apriv) { ... }

これは右から左に読みます:へのポインタへApubの参照です。これで、内部への変更は必要に応じて外部に伝播されますが、一部の式(右辺値)だけでなく、適切な変数(左辺値)を渡してその関数を呼び出す必要があることに注意してください。&*SomethingApubAprivgeneratekeys

疑わしい場合は、さらに質問するか、参照パラメータについてグーグルに問い合わせてください。

于 2012-07-02T13:42:21.597 に答える
1

あなたの問題は、値と値(つまりポインタの値)のdh_generatekeys両方を取ることです。したがって、変更するのは、ポインタではなく、ポインタのローカルコピーです。解決策は、オブジェクトへのポインタまたはポインタへの参照を渡すことです。privatekeypublickey

void encryptionalgorithm::dh_generatekeys(string shareddomain,DH_PrivateKey** privatekey, MemoryVector<unsigned char>** publickey)

また

void encryptionalgorithm::dh_generatekeys(string shareddomain,DH_PrivateKey*& privatekey, MemoryVector<unsigned char>*& publickey)
于 2012-07-02T13:42:50.023 に答える
0

私の理解が正しければ、dh_generatekeys を次のように変更する必要があります。

void encryptionalgorithm::dh_generatekeys(string shareddomain,DH_PrivateKey* &privatekey,MemoryVector<unsigned char>* &publickey) { ... }

つまり、ポインターへの参照を使用します。このようにして、それらを変更できます。

于 2012-07-02T13:43:56.893 に答える
0

呼び出し元で値を変更できるようにするには、ポインター (または参照) のアドレスを渡す必要があります。

ポインターのアドレス (ポインターへのポインター) 例:

int main(int argc, char** argv)
{   
    DH_PrivateKey *Apriv = 0;
    MemoryVector<unsigned char> *Apub = 0;
    AutoSeeded_RNG rng;
    DL_Group domain("modp/ietf/3072");
    encryption::dh_generatekeys("modp/ietf/3072",&Apriv,&Apub); //Passing address of pointers
    //...
}

void encryptionalgorithm::dh_generatekeys(string shareddomain,DH_PrivateKey **privatekey,MemoryVector<unsigned char> **publickey)
{
    AutoSeeded_RNG rng; // Irrelevant
    DL_Group shared_domain(shareddomain); // Irrelevant
    *privatekey = new DH_PrivateKey(rng, shared_domain); //dereference to assign
    MemoryVector<unsigned char> pubkey = privatekey->public_value();
    *publickey = &pubkey; //dereference to assign
    //...
}
于 2012-07-02T13:44:14.810 に答える