从不同的函数插入到 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!