在回调中收到时数据指针已更改

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_new0g_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;