Assigner un pointeur renvoyé par une fonction

J’ai un programme qui ressemble à ceci:

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

Une fois que cela est exécuté, *priv_key_p devrait contenir la valeur renvoyée par *generate_RSA_key_and_uuid .

Dans gdb, je peux voir qu’à la fin de generate_RSA_and_uuid , key_p contient la valeur correcte, mais après priv_key_p = generate_RSA_key_and_uuid(uuid); a exécuté, priv_key_p est vide.

Quelqu’un sait-il comment atsortingbuer correctement la valeur au pointeur?

Vous avez besoin d’un niveau supplémentaire d’indirection, sinon vous ne faites que modifier les copies locales des pointeurs et rien n’est renvoyé:

 int build_and_save_csr(int dn_ensortinges, 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; } 

Vous pouvez également utiliser la fonction result (comme vous le faites déjà dans generate_RSA_key_and_uuid() ) pour renvoyer le pointeur (peut-être renvoyer la valeur NULL en cas d’erreur), ce qui supprime la nécessité du niveau supplémentaire d’indirection.

C’est parce que vous devez passer un pointeur sur le pointeur.

 int makecsr(X509_REQ *req_p, EVP_PKEY *priv_key_p, char *passphrase) 

Devrait être:

 int makecsr(X509_REQ *req_p, EVP_PKEY **priv_key_p, char *passphrase) 

Vous l’appellerez par:

 makecsr(req_p, &priv_key_p, passphrase); 

Et vous devez aussi changer:

 int build_and_save_csr(int dn_ensortinges, X509_REQ *req_p, EVP_PKEY *priv_key_p, char *passphrase) 

à:

 int build_and_save_csr(int dn_ensortinges, X509_REQ *req_p, EVP_PKEY **priv_key_p, char *passphrase) 

Et fait:

 *priv_key_p = generate_RSA_key_and_uuid(uuid); 

C’était pour le correctif, maintenant l’explication:

Dans cette fonction:

 int build_and_save_csr(int dn_ensortinges, X509_REQ *req_p, EVP_PKEY *priv_key_p, char *passphrase) { priv_key_p = generate_RSA_key_and_uuid(uuid); } 

prev_key_p pointe initialement vers, eh bien, quelque part. Et puis, vous dites qu’il devrait maintenant pointer sur la valeur renvoyée par generate_RSA_key_and_uuid .

Le problème est que la nouvelle valeur de priv_key_p est uniquement locale à la fonction build_and_save_csr . Même si c’est le même nom, ce n’est pas la même variable.

Ceci est corrigé en ajoutant un autre niveau d’indirection.

C’est en fait le même problème que celui-ci:

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

Cela n’a aucun effet alors que la fonction correcte serait:

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

Dans votre cas, votre type n’est pas int mais EVP_PKEY * .