我有一个看起来像这样的程序:
EVP_PKEY *generate_RSA_key_and_uuid(unsigned char uuid[16])
{
EVP_PKEY *key_p;
key_p = EVP_PKEY_new();
return key_p;
}
int build_and_save_csr(int dn_entries, X509_REQ *req_p, EVP_PKEY *priv_key_p, char *passphrase)
{
priv_key_p = generate_RSA_key_and_uuid(uuid);
}
int makecsr(X509_REQ *req_p, EVP_PKEY *priv_key_p, char *passphrase)
{
if (build_and_save_csr(2, req_p, priv_key_p, passphrase) != 0) {
fprintf(stderr, "Could not create csr file / private key...\n");
exit(1);
}
return 0;
}
int main(int argc, char *argv[])
{
EVP_PKEY *priv_key_p;
X509_REQ *req_p;
makecsr(req_p, priv_key_p, passphrase);
return 0;
}
运行此操作后,*priv_key_p
应包含*generate_RSA_key_and_uuid
返回的值。
在gdb中,我可以看到generate_RSA_and_uuid
末尾key_p
包含正确的值,但在priv_key_p = generate_RSA_key_and_uuid(uuid);
执行后,priv_key_p
为空。
有人知道如何正确地将值分配给指针吗?
答案 0 :(得分:6)
您需要额外的间接级别,否则您只需修改指针的本地副本而不会返回任何内容:
int build_and_save_csr(int dn_entries, X509_REQ *req_p, EVP_PKEY **priv_key_p, char *passphrase)
{
*priv_key_p = generate_RSA_key_and_uuid(uuid);
}
int makecsr(X509_REQ *req_p, EVP_PKEY **priv_key_p, char *passphrase)
{
if (build_and_save_csr(2, req_p, priv_key_p, passphrase) != 0) {
fprintf(stderr, "Could not create csr file / private key...\n");
exit(1);
}
return 0;
}
int main(int argc, char *argv[])
{
EVP_PKEY *priv_key_p;
X509_REQ *req_p;
makecsr(req_p, &priv_key_p, passphrase);
return 0;
}
或者你可以使用函数结果(正如你在generate_RSA_key_and_uuid()
中所做的那样)来返回指针(可能在出错时返回NULL) - 这就省去了额外的间接级别。
答案 1 :(得分:4)
那是因为您需要将指针传递给指针。
int makecsr(X509_REQ *req_p, EVP_PKEY *priv_key_p, char *passphrase)
应该是:
int makecsr(X509_REQ *req_p, EVP_PKEY **priv_key_p, char *passphrase)
你可以通过以下方式来称呼它:
makecsr(req_p, &priv_key_p, passphrase);
你还必须改变:
int build_and_save_csr(int dn_entries, X509_REQ *req_p, EVP_PKEY *priv_key_p, char *passphrase)
为:
int build_and_save_csr(int dn_entries, X509_REQ *req_p, EVP_PKEY **priv_key_p, char *passphrase)
并做:
*priv_key_p = generate_RSA_key_and_uuid(uuid);
那是针对修复的,现在是解释:
在此功能中:
int build_and_save_csr(int dn_entries, X509_REQ *req_p, EVP_PKEY *priv_key_p, char *passphrase)
{
priv_key_p = generate_RSA_key_and_uuid(uuid);
}
prev_key_p
最初指向某个地方。然后你说它现在应该指向generate_RSA_key_and_uuid
返回的值。
问题是priv_key_p
的新值只是函数build_and_save_csr
的本地值。即使它的名称相同,也不是同一个变量。
通过添加另一个间接级别来解决这个问题。
这实际上是同样的问题:
void inc(int a) {
a += 1;
}
这没有效果,而正确的功能是:
void inc(int *a) {
*a += 1;
}
在您的情况下,您的类型不是int
,而是EVP_PKEY *
。