分配从函数返回的指针

时间:2013-10-10 12:51:30

标签: c function pointers 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;
}

运行此操作后,*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为空。

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

2 个答案:

答案 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 *