問題是,您如何知道返回的數組中有多少個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);
}