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:privatekey指针仍然指向0x00,它没有指向新实例化的对象,这会导致后面的分段错误。问题2:与publickey相同,当我在堆栈上创建“pubkey”然后将publickey指针指向它的地址时,publickey只是保持0x00。

任何帮助,将不胜感激。我希望这很简单!

多谢你们。

4

4 回答 4

4

您的参数是按值传递的。

这意味着,如果您在privatekey函数内修改指针的值,您只会修改该函数的局部变量。

您可能希望更改函数签名以接受参数作为引用:

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

这从右到左读取:Apub是对&指向 的指针*的引用SomethingApub现在,对内部和Apriv内部的任何更改generatekeys都将根据需要传播到外部,但请注意,您需要调用传递适当变量(左值)的函数,而不仅仅是一些表达式(右值)。

如有疑问,请进一步询问或使用谷歌获取参考参数。

于 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 回答