分配从函数返回的指针

Tom*_*eck 3 c pointers function return-value

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

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;
}
Run Code Online (Sandbox Code Playgroud)

运行之后,*priv_key_p应该包含从中返回的值*generate_RSA_key_and_uuid.

在gdb中,我可以看到,在最后的generate_RSA_and_uuidkey_p包含正确的值,但之后priv_key_p = generate_RSA_key_and_uuid(uuid);一直执行,priv_key_p是空的.

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

Pau*_*l R 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;
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用函数结果(如您所知generate_RSA_key_and_uuid())返回指针(可能在出错时返回NULL) - 这消除了对额外级别的间接的需要.