正如在 issue#2217 中所写的那样,我想设计一个函数,它在第一个输出参数中返回一个 oid 列表。
我应该:
- 将 oid 列表作为指向指针的指针返回?
int git_commit_tree_last_commit_id(git_oid **out, git_repository *repo, const git_commit *commit, char *path)
- 或者将 oid 列表作为指向自定义结构的指针返回?
int git_commit_tree_last_commit_id(git_oid_xx_struct *out, git_repository *repo, const git_commit *commit, char *path)
你有什么建议?
最佳答案
问题是,你怎么知道返回的数组中有多少个OID,底层内存又是谁分配的。
对于第一部分有几种可能性,
- 在单独的返回参数中返回数字,
- 使用标记值终止列表。
- 返回一个新的结构类型,比如
git_strarray
包含计数和 原始数据。
对于第二部分,要么
- 调用者可以分配底层内存
- 函数可以分配内存
- 新的结构类型可以管理内存。
您走哪条路取决于您希望代码看起来像什么、您希望它被重用多少、性能有多关键等。
首先我会选择最简单的,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);
}
关于c - 如何设计一个返回 oid 数组的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22744207/