使用GLib';s GArray存储'structs'并检索数据

使用GLib';s GArray存储'structs'并检索数据,c,pointers,struct,glib,C,Pointers,Struct,Glib,我正在尝试使用GLib作为编写自己的数据结构的替代方法。我的目标是仅使用glib编写一个基于邻接列表的简单图形数据结构 现在的代码如下 #include <glib.h> #include <glib/gprintf.h> struct graph { GArray * nodes; }; struct node { GArray * neighbors; gint weight; GString * label; }; struct

我正在尝试使用GLib作为编写自己的数据结构的替代方法。我的目标是仅使用glib编写一个基于邻接列表的简单图形数据结构

现在的代码如下

#include <glib.h>
#include <glib/gprintf.h>

struct graph
{
    GArray * nodes;
};

struct node
{
    GArray * neighbors;
    gint weight;
    GString * label;
};

struct neighbor
{
    struct node * dst;
    gint weight;
};

struct graph * graph_new(void);
void graph_node_add(struct graph * graph, const gchar * label, gint weight);
void graph_edge_add(struct graph * graph, struct node * src, struct node * dst, gint weight);

struct graph * graph_new(void)
{
    struct graph * g = g_new(struct graph, 1);
    g->nodes = g_array_new (FALSE, FALSE, sizeof (struct node));
    return g;
}

void graph_node_add(struct graph * graph, const gchar * label, gint weight)
{
    struct node * node = g_new(struct node, 1);
    node->neighbors = g_array_new(FALSE, FALSE, sizeof (struct neighbor));
    node->label = g_string_new(label);
    node->weight = weight;
    graph->nodes = g_array_append_val(graph->nodes, node);
}

void graph_edge_add(struct graph *graph, struct node *src, struct node *dst, gint weight)
{
    struct neighbor * neighbor = g_new(struct neighbor, 1);
    neighbor->dst = dst;
    neighbor->weight = weight;
    src->neighbors = g_array_append_val(src->neighbors, neighbor);
}


int main(void)
{
    struct graph * G = graph_new();
    graph_node_add(G, "u", 10);
    graph_node_add(G, "v", 20);
    graph_node_add(G, "w", 15);

    struct node * n = &g_array_index(G->nodes, struct node, 0);
    g_printf("segfaulting here\n");
    char * s = n->label->str;
    g_printf("LABEL %s\n", s);

    return(0);
}

这是因为在graph_node_add()中,您最终向数组添加了一个指针,而不是要添加的数据

类似的方法可能会奏效:

struct node node;
node.neighbors = g_array_new(FALSE, FALSE, sizeof (struct neighbor));
node.label = g_string_new(label);
node.weight = weight;
graph->nodes = g_array_append_val(graph->nodes, node);

这是因为在graph_node_add()中,您最终向数组添加了一个指针,而不是要添加的数据

类似的方法可能会奏效:

struct node node;
node.neighbors = g_array_new(FALSE, FALSE, sizeof (struct neighbor));
node.label = g_string_new(label);
node.weight = weight;
graph->nodes = g_array_append_val(graph->nodes, node);