问题是,您如何知道返回的数组中有多少个OID,以及谁分配了底层内存。
在第一部分有几种可能,
- 返回在一个单独的返回参数的数量,
- 使用的警戒值结束列表。
- 返回一个新的结构类型,如
git_strarray
,其中包含count和 原始数据。
对于第二部分,无论是
- 主叫方可以分配底层存储器
- 的功能可以分配内存
- 新的结构类型可以管理存储器。
你去哪个小路取决于你想要的代码是什么样子,它多少你希望得到重用,关键是如何表现等
首先我会与去最简单的是哪个IMO函数返回计数并分配内存。
这意味着我的功能就必须是这样的:
int get_some_oids_in_an_array(OID** array, int * count, ...) {
...
*count = number_of_oids;
*array = (OID*)malloc(sizeof(OID)*number_of_oids);
for(i=0; i<number_of_oids; ++i) {
*array[i]=...;
}
...
return 0;
}
/* Example of usage */
void use_get_oids() {
OID* oids;
int n_oids;
int ok = get_some_oids_in_an_array(&oids, &n_oids, ...);
for(i=0; i<n_oids; ++i) {
... use oids[i] ...
}
free(oids);
}
注:我返回OID的数组,而不是OID *的数组,要么是一个有效的选项,这将最适合你的工作将会有所不同。
如果事实证明我经常使用这种模式,那么会考虑切换到结构路由。
int get_some_oids(oidarray * oids, ...) {
int i;
oidarray_ensure_size(number_of_oids);
for(i=0; i<number_of_oids; ++i) {
oidarray_set_value(i, ...);
}
return 0;
}
typedef struct oidarray {
size_t count;
OID* oids;
};
/* Example of usage */
void use_get_oids() {
oid_array oids = {0};
get_some_oids(&oids);
for(i=0; i<oids.count; ++i) {
... use oids.oids[i] ...
}
oidarray_release(&oids);
}