我希望我没有过度简化我的代码,但我基本上要做的是找到容器中元素的存在,并返回指向它的指针。
我有像
这样的结构typedef struct INHs{
int ID;
} INHs;
typedef struct sub_container{
INHs** list_inh;
int nb_list;
} sub_container;
typedef struct container {
sub_container* cont;
int nb_elem;
} container;
然后在我的main方法中我分配了一个容器(为了简单起见,我会将其留下来,并给出一个给定的ID;现在我不想迭代子容器来找到我的目标INHs结构)。
INHs** test_INH = NULL;
INHs** return_val = NULL;
int ID = 10;
container* cont; //allocated on all memory
for (uint n=0; !test_INH && n<container_nb_elem; n++){
return_val = find_ptr(&cont[n], ID, &test_INH);
}
INHs** find_ptr(sub_container* sub_cont, int ID, INHs*** test){
INHs** res = NULL;
for (uint i=0; !res && i<sub_cont->nb_list; i++){
if (sub_cont->list_inh[i].ID == ID) {
(*test) = &(sub_cont->list_inh[i]);
res = &(sub_cont->list_inh[i]);
}
return res;
}
我知道我不需要我的元素的返回值和另一个作为函数参数的返回值,但这些是我尝试过的两个版本。我不知道我做错了什么但是valgrind崩溃告诉我要么&#34; test_INH&#34;或&#34; result_val&#34;是非初始化的,虽然我将它们设置为null。
有人看到我在这里缺少的东西吗?
答案 0 :(得分:1)
typedef struct INHs{
int id;
} INHs;
typedef struct sub_container{
INHs **ptrs;
int nb_list;
} sub_container;
typedef struct container {
sub_container *items;
int nb_elem;
} container;
int main(void)
{
INHs **found = NULL;
int id = 10;
container *cont; //allocated on all memory
for (uint n=0; n < cont->nb_elem; n++){
found = find_ptr( &cont->items[n], id);
if (found) break; /* found it! */
}
if(found) {
/* do something useful with *found ... */
}
return 0;
}
INHs **find_ptr(sub_container *sub_cont, int id)
{
for (uint i=0; i < sub_cont->nb_list; i++){
if (sub_cont->ptrs[i]->id != id) continue;
return &sub_cont->ptrs[i];
}
return NULL;
}
BTW:我发现指向一个integer
结构的指针数组很奇怪。
这些结构都是malloc()d吗?