2013-10-10 31 views
3

返回我有一個程序,它看起來像這樣:分配的指針從功能

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是空的。

有人知道如何正確地賦值給指針嗎?

回答

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) - 這樣就不需要額外的間接級別。

+0

它不應該是'build_and_save_csr'簽名中的'EVP_PKEY ** priv_key_p'嗎? – jev

+0

@jev:很好的接受 - 謝謝 - 容易錯過'*'! –

+0

完美。非常感謝,這讓我瘋狂 – TomSelleck

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

在你的情況,你的類型不是intEVP_PKEY *