分配从函数返回的指针

我有一个看起来像这样的程序:

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为空。

有人知道如何正确地将值赋给指针吗?

你需要一个额外的间接级别,否则你只需要修改指针的本地副本而不返回任何内容:

 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) – 这就不需要额外的间接级别了。

那是因为你需要传递指针指针。

 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); 

这是修复,现在的解释:

在这个function:

 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; } 

这没有效果,而正确的function是:

 void inc(int *a) { *a += 1; } 

在您的情况下,您的类型不是int而是EVP_PKEY *