在回调中收到时数据指针已更改
Data pointer has changed when received in the callback
我有一个列表存储树视图。单击其中的一个项目调用 "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);
....................
}
通过将 start 设置为静态变量来解决问题
静态结构节点* 开始 = 0;
您的问题来自 parameters->start = &start;
无法在该功能之外工作。你应该通过 g_new0
或 g_malloc
分配一些内存并由 deviceDiscovery
填充它,或者 deviceDiscovery
应该 return 你一个分配的节点.由于需要 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;
我有一个列表存储树视图。单击其中的一个项目调用 "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);
....................
}
通过将 start 设置为静态变量来解决问题 静态结构节点* 开始 = 0;
您的问题来自 parameters->start = &start;
无法在该功能之外工作。你应该通过 g_new0
或 g_malloc
分配一些内存并由 deviceDiscovery
填充它,或者 deviceDiscovery
应该 return 你一个分配的节点.由于需要 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;