【发布时间】:2020-03-01 18:52:01
【问题描述】:
我不确定我是否遗漏了什么,这可能会使这个问题变得非常愚蠢。但是我不明白为什么在尝试了几乎所有可能的方法之后它会失败。
所以,超级简单,我有这个 GLib 树,我想在其他函数中插入东西。为什么下面提供的选项都不起作用?老实说,我更能理解第一个失败比第二个失败。
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 行符号
【问题讨论】:
-
gpointer gcp = &code;创建一个指向具有自动存储持续时间的值的指针。在函数退出后将该指针插入树中将该指针变为悬空指针 -
@UnholySheep 老实说我完全不明白。你的意思是我确实在改变树但是当我离开函数时我所做的改变被“改变”了?如果是这样,那么我该如何解决这个问题?因为我需要一个 gpointer,并且我需要在其他函数中将东西插入到树中:/
-
@UnholySheep 我查了一下,发现我不需要将 int 转换为 gpointer,我猜这个事实让我特别困惑。那么,改变它应该使程序工作吗? (只是问,因为我没有立即访问测试的地方并且可以回答)感谢您的帮助,一旦我设法测试出差异,我会将这篇文章标记为通过您的链接解决!
-
您需要做的是分配键和值,使它们比函数调用更“活跃”。例如:通过使用
malloc(但你需要确保它得到free'd)