这个问题是关于处理我自己研究的这个指针问题的最佳实践。
我有一个在读取 csv 的函数中动态生成的结构数组。
int init_from_csv(instance **instances,char *path) {
... open file, get line count
*instances = (instance*) malloc( (size_t) sizeof(instance) * line_count );
... parse and set values of all instances
return count_of_valid_instances_read;
}
// in main()
instance *instances;
int ins_len = init_from_csv(&instances, "some/path/file.csv");
现在,我必须对这些原始数据执行功能,对其进行拆分,然后在拆分后再次执行相同的功能。这个数据集可能相当大,所以我不想复制实例,我只想要一个指向拆分中的结构的指针数组。
instance **split = (instance**) malloc (sizeof(instance*) * split_len_max);
int split_function(instance *instances, ins_len, instances **split){
int i, c;
c = 0;
for (i = 0; i < ins_len; i++) {
if (some_criteria_is_true) {
split[c++] = &instances[i];
}
return c;
}
现在我的问题是在结构数组和指针数组上执行函数的最佳实践或最易读的方式是什么?举个简单的例子count_data()
。
int count_data (intances **ins, ins_len, float crit) {
int i,c;
c = 0;
for (i = 0; i < ins_len; i++) {
if ins[i]->data > crit) {
++c;
}
}
return c;
}
// code smell-o-vision going off by now
int c1 = count_data (split, ins_len, 0.05); // works
int c2 = count_data (&instances, ins_len, 0.05); // obviously seg faults
我可以让我的 init_from_csv malloc 成为一个指向实例的指针数组,然后 malloc 我的实例数组。在我开始更改一堆代码之前,我想了解一个经验丰富的 c 程序员如何处理这种事情。