我有一个列表存储树视图。单击其中的一个项目调用“replace_tab”并添加一个后退按钮进行显示。单击后退按钮调用Back.Back。处理程序传递指向列表的指针实例。我在调用后处理程序之前和之后都打印了指针的值。
struct BTDeviceDetails
{
char*addr;
char*name;
};
struct node
{
struct node* next;
struct BTDeviceDetails * data;
};
struct param
{
GtkWidget* backbutton;
GtkWidget* Okbutton;
GtkWidget* scrolledwindow;
GtkWidget*newChild;
GtkWidget*oldChild;
struct node** start;
};
static void Back (GtkButton *button, gpointer user_data)
{
struct param* parameters = (struct param*)user_data;
printf("\nreplacetab=%p\n",(void*)*(parameters->start)); // prints-> "replacetab=0x7fffcd8b1320"
............
}
static void replace_tab(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
{
struct node * start = 0;
deviceDiscovery(&start);
.............
parameters->start = &start;
printf("\n replacetab=%p \n",(void*)*(parameters->start)); // prints-> "replacetab=(nil)"
g_signal_connect(parameters->newChild,"row-activated", G_CALLBACK( registerDevice ) ,&start);
g_signal_connect(parameters->backbutton, "clicked", G_CALLBACK(Back), (gpointer) parameters);
}
int main()
{
....................
g_signal_connect(treeview, "row-activated", G_CALLBACK(replace_tab), (gpointer) parameters);
....................
}
答案 0 :(得分:1)
你的问题来自于parameters->start = &start;
无法在该功能之外工作的事实。您应该通过g_new0
或g_malloc
分配一些内存并将其填充deviceDiscovery
,或者deviceDiscovery
应该返回一个已分配的节点。因为需要node **
,所以更有可能是第二种选择。
然后在你的参数中,不要存储node **start
,你只需要内容,而不是我想的存储位置,所以node *start
就足够了。然后你就可以写下:
struct node *start = NULL;
deviceDiscovery(&start); // Allocates structure memory and initializes it
// You may want to check if start != NULL to avoid errors later.
parameters->start = start;
答案 1 :(得分:0)
通过将start作为静态变量来解决问题 static struct node * start = 0;