c - 输出参数中带有指向对象的指针的动态数组

标签 c arrays pointers dynamic openssl

我有一个函数可以从服务器获取多个 X.509 证书。我希望它在 OpenSSL 的 X509 * 结构中“返回”这些证书的数组。但由于我的接口(interface)返回错误代码,我想使用 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/

相关文章:

c - 为什么我运行c程序后总是得到0?请帮助我

php - 在php中将字符串转换为多维数组

c++ - 结构转发列表项消失了吗?

C 关于不同数据类型的指针

c++ - Caesar Cipher C++(数组和指针)

c - 传递指针的free() 'know'如何有效?

C 错误, "' 预期为 '=' ',' ';' 、 'asm' 或 '__attribute__' 之前 'Bufferpar' "

两个排序数组中最接近的对和

SQL 句柄以及如何正确创建一个?

arrays - 将循环缓冲区移位/对齐/旋转到原地零