Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 动态数组,带有指向对象输入输出参数的指针_C_Arrays_Pointers_Dynamic_Openssl - Fatal编程技术网

C 动态数组,带有指向对象输入输出参数的指针

C 动态数组,带有指向对象输入输出参数的指针,c,arrays,pointers,dynamic,openssl,C,Arrays,Pointers,Dynamic,Openssl,我有一个从服务器获取多个X.509证书的函数。我希望它在OpenSSL的X509*structs中“返回”这些证书的数组。但是由于我的接口返回错误代码,我想使用out参数 如果我没有被误导,这将要求我使用带有3(!)*(例如X509***证书)的指针。我来这里是因为我个人觉得这非常令人困惑。以下是我的计划,我想知道我是否完全走错了方向(在我看来): 这是正确的方法吗?因为对我来说,这三个指针看起来很奇怪 注意:我不知道将有多少个证书,因此它必须是一个动态数组。只需应用左右读取规则X509***证

我有一个从服务器获取多个
X.509
证书的函数。我希望它在OpenSSL的
X509*
structs中“返回”这些证书的数组。但是由于我的接口返回错误代码,我想使用out参数

如果我没有被误导,这将要求我使用带有3(!)
*
(例如
X509***证书
)的指针。我来这里是因为我个人觉得这非常令人困惑。以下是我的计划,我想知道我是否完全走错了方向(在我看来):

这是正确的方法吗?因为对我来说,这三个指针看起来很奇怪


注意:我不知道将有多少个证书,因此它必须是一个动态数组。

只需应用左右读取规则<代码>X509***证书表示证书是指向指向X509的指针的指针。因此,如果您想将
X509**
返回给调用者,调用者需要向您传递一个
X509***
,以便您将其存储在其中

另外,我不确定你处理单个证书的逻辑是否正确。。。它应该是这样的(imo)——注意for循环中额外的malloc

int get_certs(X509 ***certs)
{
    X509 **local_certs;
    int i;
    local_certs = malloc(no_of_certs * sizeof(X509 *));
    // fetch certs
    for(i=0; i < no_of_certs; ++i)
    {
        X509* cert = malloc( sizeof( X509 ) );
        // load single cert into variable "cert"
        local_certs[i] = cert
    }
    *certs = local_certs;
}
我错了,我知道我感觉错了。这里是第一个问题:如果以这种方式返回,我如何知道其中有多少证书?我不。但OpenSSL已经通过所谓的堆栈解决了这一问题:

int get_certs(STACK_OF(X509) **certs)
{
    STACK_OF(X509) *local_certs;
    int i;
    // load variable local_certs with content
    // in my case that is a PKCS#7 data structure
    *certs = local_certs;
}

我缩短了我的数据源,因为我已经知道它,但它更复杂。这看起来好多了,OpenSSL现在提供了一些功能,如
sk_X509_push
sk_X509_num
。这是一个很好的抽象,解决了我的问题。

1。由于源正确分配了证书,因此不需要额外的malloc。2.返回不是一个选项,这必须是一个错误代码。足够公平。。。那么你的问题的答案在我的答案的第一段给出了,其余的都是多余的。
int get_certs(X509 ***certs)
{
    X509 **local_certs;
    int i;
    local_certs = malloc(no_of_certs * sizeof(X509 *));
    // fetch certs
    for(i=0; i < no_of_certs; ++i)
    {
        X509* cert = malloc( sizeof( X509 ) );
        // load single cert into variable "cert"
        local_certs[i] = cert
    }
    *certs = local_certs;
}
X509** get_certs( int no_of_certs )
{
    X509 **local_certs;
    int i;
    local_certs = malloc(no_of_certs * sizeof(X509 *));
    // fetch certs
    for(i=0; i < no_of_certs; ++i)
    {
        X509* cert = malloc( sizeof( X509 ) );
        // load single cert into variable "cert"
        local_certs[i] = cert
    }
    return local_certs;
}
int get_certs(STACK_OF(X509) **certs)
{
    STACK_OF(X509) *local_certs;
    int i;
    // load variable local_certs with content
    // in my case that is a PKCS#7 data structure
    *certs = local_certs;
}