在 glib 的 g_new() 中使用内存分配

Using Memory Allocation with glib's g_new()

我一直在使用 g_new() 为单个结构分配内存,按以下方式就可以了。

/*Structure*/
typedef struct
{
    guint16 index;
    gchar * date;
    gchar * number;
}h_item;

/*allocation*/
h_item * my_h_item = g_new(h_item, 1);

/*freeing function*/
void free_h_item(h_item * item)
{
    g_free(item->date);
    g_free(item->number);
    g_free(item);
}

我现在正在尝试对结构的数组 [2] 执行相同的操作,例如 静态分配是这样的,但这意味着它在程序堆栈上。

h_item my_h_item[5];

我想动态分配上面的相同内容,但是当 运行 程序时我似乎遇到了麻烦...

/*Structure*/
typedef struct
{
    guint16 index;
    gchar * date;
    gchar * number;
}h_item;


/*freeing function*/
void free_h_item(h_item * item)
{
    g_free(item->date);
    g_free(item->number);
    g_free(item);
}

static h_item * my_h_item[2];

int main()
{
    /*allocation*/
    my_h_item[2] = g_new(h_item, 2);

    my_h_item[0]->date = g_strdup("12345"); /*Test*/
    return 0;
}

此程序编译但出现段错误...

#0  0x00000000004007a7 in main () at struct_memory.c:30
30      my_h_item[0]->date = g_strdup("12345"); /*Test*/

我的分配哪里出错了?

您已分配 my_h_item[2] 并且您正在访问未分配的 my_h_item[0]

您还需要在使用其元素之前分配 my_h_item[0]

my_h_item[2] 无效,因为 my_h_item 只有 2 个元素,只有 my_h_item[0] 和 my_h_item[1] 有效

你说你想创建一个包含 2 个结构的数组。 您创建的是一个包含两个指针的数组。

你需要做的是

static h_item * my_h_item;

然后

h_item = g_new(h_item, 2);

然后您可以将这两个结构用作 h_item[0]h_item[1],并将其中的日期用作

h_item[0].data = g_strdup(...);

还有 g_* class 函数是非标准的。请使用 malloc 和 free。