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