GArray、GPtrArray、GByteArray


在處理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;