我有一个从服务器获取几个X.509证书的函数。我希望它“返回” OpenSSL的X509 *结构中的那些证书数组。但是由于我的界面返回错误代码,因此我想使用out参数。

如果我没有误导,这将要求我使用带有3(!)*(例如X509 ***certs)的指针。我在这里是因为我个人觉得这很令人困惑。这是我打算做的事情,我想知道我是否完全走错了轨道(在我看来):

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)
    {
        // load single cert into variable "cert"
        local_certs[i] = cert
    }
    *certs = local_certs;
}


呼叫可能看起来像这样:

X509 **certs;
get_certs(&certs);


这是正确的方法吗?因为对我来说,这个三分指针似乎很奇怪。

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

最佳答案

只需应用左右读取规则... X509 ***certs表示certs是指向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;
}


一种替代方法是从函数返回X509**

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

关于c - 动态数组,带有指向外部参数中对象的指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16002390/

10-10 11:24