从不同的函数插入到 GLib Tree
Inserting into GLib Tree from different functions
我不确定我是否遗漏了什么,这可能会使这个问题变得非常愚蠢。但是我不明白为什么在尝试了几乎所有可能的方法之后它都会失败。
所以,非常简单,我有这个 GLib 树,我想在其他函数中向其中插入内容。为什么下面显示的 none 个选项有效?老实说,我能理解第一个失败比第二个更失败。
int compare_ints(gconstpointer gpa, gconstpointer gpb){
int a = *((int*) gpa);
int b = *((int*) gpb);
return (a-b);
}
void test1(GTree* tree){
int code = 1234;
gpointer gcp = &code;
g_tree_insert(tree, gcp, gcp);
printf("%d\n", (g_tree_lookup(tree, gcp) == NULL)); // Outputs 0 (obviously)
}
void test2(GTree** tree){
int code = 1234;
gpointer gcp = &code;
g_tree_insert(*tree, gcp, gcp);
printf("%d\n", (g_tree_lookup(*tree, gcp) == NULL)); // Outputs 0 (obviously)
}
int main(int argc, char** argv){
GTree* tree = g_tree_new(compare_ints);
int code = 1234;
gpointer gcp = &code;
test1(tree);
printf("%d\n", (g_tree_lookup(tree, gcp) == NULL)); // Outputs 1 (Why?)
test2(&tree);
printf("%d\n", (g_tree_lookup(tree, gcp) == NULL)); // Outputs 1 (Why?)
return 0;
}
如果这是一个愚蠢的问题,我们深表歉意,感谢您的帮助:)
编辑:删除了 vim 行符号
正如@UnholySheep 在主线程的评论中提到的,执行以下操作会起作用:
void test1(GTree* tree, int* code){
g_tree_insert(tree, code, code);
printf("%d\n", (g_tree_lookup(tree, code) == NULL));
}
void test2(GTree** tree, int* code){
g_tree_insert(*tree, code, code);
printf("%d\n", (g_tree_lookup(*tree, code) == NULL));
}
int main(int argc, char** argv){
Catalog* c = init_catalog(26, 1, compare_ints);
int* code = malloc(sizeof(int));
*code = 1234;
GTree* tree = g_tree_new(compare_ints);
test1(tree, code);
printf("%d\n", (g_tree_lookup(tree, code) == NULL));
test2(&tree, code);
printf("%d\n", (g_tree_lookup(tree, code) == NULL));
destroy_catalog(c);
free(code);
return 0;
}
之所以有效,是因为 code 只有在您释放它时才会消失!
在函数末尾的初始情况下,int 将停止存在,这将证明该行为是合理的。如果你有兴趣阅读更多关于它的信息,请查看 UnholySheep 在主线程评论中提到的 link!
我不确定我是否遗漏了什么,这可能会使这个问题变得非常愚蠢。但是我不明白为什么在尝试了几乎所有可能的方法之后它都会失败。
所以,非常简单,我有这个 GLib 树,我想在其他函数中向其中插入内容。为什么下面显示的 none 个选项有效?老实说,我能理解第一个失败比第二个更失败。
int compare_ints(gconstpointer gpa, gconstpointer gpb){
int a = *((int*) gpa);
int b = *((int*) gpb);
return (a-b);
}
void test1(GTree* tree){
int code = 1234;
gpointer gcp = &code;
g_tree_insert(tree, gcp, gcp);
printf("%d\n", (g_tree_lookup(tree, gcp) == NULL)); // Outputs 0 (obviously)
}
void test2(GTree** tree){
int code = 1234;
gpointer gcp = &code;
g_tree_insert(*tree, gcp, gcp);
printf("%d\n", (g_tree_lookup(*tree, gcp) == NULL)); // Outputs 0 (obviously)
}
int main(int argc, char** argv){
GTree* tree = g_tree_new(compare_ints);
int code = 1234;
gpointer gcp = &code;
test1(tree);
printf("%d\n", (g_tree_lookup(tree, gcp) == NULL)); // Outputs 1 (Why?)
test2(&tree);
printf("%d\n", (g_tree_lookup(tree, gcp) == NULL)); // Outputs 1 (Why?)
return 0;
}
如果这是一个愚蠢的问题,我们深表歉意,感谢您的帮助:)
编辑:删除了 vim 行符号
正如@UnholySheep 在主线程的评论中提到的,执行以下操作会起作用:
void test1(GTree* tree, int* code){
g_tree_insert(tree, code, code);
printf("%d\n", (g_tree_lookup(tree, code) == NULL));
}
void test2(GTree** tree, int* code){
g_tree_insert(*tree, code, code);
printf("%d\n", (g_tree_lookup(*tree, code) == NULL));
}
int main(int argc, char** argv){
Catalog* c = init_catalog(26, 1, compare_ints);
int* code = malloc(sizeof(int));
*code = 1234;
GTree* tree = g_tree_new(compare_ints);
test1(tree, code);
printf("%d\n", (g_tree_lookup(tree, code) == NULL));
test2(&tree, code);
printf("%d\n", (g_tree_lookup(tree, code) == NULL));
destroy_catalog(c);
free(code);
return 0;
}
之所以有效,是因为 code 只有在您释放它时才会消失!
在函数末尾的初始情况下,int 将停止存在,这将证明该行为是合理的。如果你有兴趣阅读更多关于它的信息,请查看 UnholySheep 在主线程评论中提到的 link!