GTK Gossip: GArray、GPtrArray、GByteArray

本文介绍如何使用GLib库中的GArray来处理动态数组,包括创建、添加元素及索引访问等操作,并通过示例代码展示了GArray和GPtrArray的具体用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在處理C的陣列時,您必須處理陣列長度的問題,您可以使用GLib的GArray,並搭配各個所提供的函式,在使用陣列上會更為方便,GArray的定義如下:

typedef struct {
  gchar *data;
  guint len;
} GArray;


您有兩種建立GArray的方式:

GArray* g_array_sized_new(gboolean zero_terminated,
                          gboolean clear_,
                          guint element_size,
                          guint reserved_size);

GArray* g_array_new(gboolean zero_terminated,
                    gboolean clear_,
                    guint element_size);

g_array_sized_new()的第一個參數 zero_terminated設定為TRUE的話,會加入最後一個額外元素,全部的位元都設定為0,clear_設定為TRUE的話,陣列的全部元素會 設定為0,element_size則是用來設定每個元素的長度,reserved_size則是用以設定陣列的長度,g_array_new()則是巨 集定義的簡化版本,預設長度為0,若加入新的元素,則自動增加陣列長度。

要加入新的元素,可以使用g_array_append_val()函式,要依索引取出元素,則可以使用g_array_index()函式,下面這個程式是個簡單的示範:

  • garray_demo.c
#include <glib.h>

int main(int argc, char *argv[]) {
GArray *garray;
gint i;

garray = g_array_new(FALSE, FALSE, sizeof(gint));

for (i = 0; i < 5; i++) {
g_array_append_val(garray, i);
}

for (i = 0; i < 5; i++) {
g_printf("%d/n", g_array_index(garray, gint, i));
}

g_array_free (garray, TRUE);

return 0;
}


執行結果如下:

0
1
2
3
4


搭配GArray的函式還有g_array_remove_index()、g_array_sort()等,您可以參考 Arrays 的說明。

與GArray類似的是GPtrArray,只不過GArray儲存的是數值(若是structs,則會複製至GArray中),而GPtrArray儲存的是指標,GPtrArray的定義如下:

typedef struct {
  gpointer *pdata;
  guint        len;
} GPtrArray;


舉個例子來說,若要儲存GString的指標,則可以如下所示:

  • gptrarray_demo.c
#include <glib.h>

int main(int argc, char *argv[]) {
GPtrArray *array;
gint i;
GString *text;

array = g_ptr_array_new();
for (i = 0; i < 5; i++) {
text = g_string_sized_new(5);
g_string_printf(text, "TEST %d", i);
g_ptr_array_add(array, text);
}

for (i = 0; i < 5; i++) {
text = g_ptr_array_index(array, i);
g_printf("%s/n", text->str);
}

g_ptr_array_free(array, TRUE);

return 0;
}


執行結果如下所示:

TEST 0
TEST 1
TEST 2
TEST 3
TEST 4


GByteArray則允許您儲存guint8的資料,用於儲存位元組資料,為GArray的一個簡化形式,其定義如下:

typedef struct {
  guint8 *data;
  guint len;
} GByteArray;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值