我是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。
任何帮助将不胜感激。我希望这很简单!
谢谢你们。
答案 0 :(得分:4)
您的参数按值传递。
这意味着,如果修改函数内指针privatekey
的值,则只修改该函数的局部变量。
您可能希望更改函数签名以接受参数作为引用:
void generatekeys(Something *& Apub, Something *& Apriv) { ... }
从右到左阅读:Apub
是指针&
到*
的引用Something
。现在,对Apub
内的Apriv
和generatekeys
的任何更改都会根据需要传播到外部,但请注意,您需要调用该函数传递适当的变量(左值),而不仅仅是一些表达式(rvalues)。
如有疑问,请进一步询问或使用谷歌参考参数。
答案 1 :(得分:1)
您的问题是dh_generatekeys
按privatekey
和publickey
取值(即指针的值)。因此,您修改的是指针的本地副本,而不是指针。解决方案只是将指针或引用传递给指向对象的指针,所以:
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)
答案 2 :(得分:0)
如果我理解正确,我们应该将dh_generatekeys更改为:
void encryptionalgorithm::dh_generatekeys(string shareddomain,DH_PrivateKey* &privatekey,MemoryVector<unsigned char>* &publickey) { ... }
也就是说使用对指针的引用。这样你就可以改变它们。
答案 3 :(得分: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
//...
}