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

时间:2017-05-11 03:47:11

标签: c memory-management struct heap-memory glib

我一直在使用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*/

我的分配在哪里出错?

2 个答案:

答案 0 :(得分:3)

您已分配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]有效

答案 1 :(得分:3)

你说你想要创建一个包含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_ *类函数也是非标准的。请使用malloc并免费。

相关问题