4

次のようなプログラムがあります。

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_ppriv_key_p = generate_RSA_key_and_uuid(uuid);priv_key_p

ポインターに値を適切に割り当てる方法を知っている人はいますか?

4

2 に答える 2

7

余分なレベルの間接化が必要です。そうしないと、ポインターのローカル コピーを変更するだけで、何も返されません。

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 を返します)。これにより、余分なレベルの間接化が不要になります。

于 2013-10-10T13:00:36.310 に答える
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;
}

あなたの場合、あなたのタイプはintbutではありませんEVP_PKEY *

于 2013-10-10T13:00:59.047 に答える