come from:
http://blog.youkuaiyun.com/plusboy/article/details/1491508
glib库中的数组GArray类型很像C++标准容器库中的vector容器。要使用glib库中的数组中需要声明一个指向GArray类型的指针。GArray的定义如下:
glib库中的数组GArray类型很像C++标准容器库中的vector容器。要使用glib库中的数组中需要声明一个指向GArray类型的指针。GArray的定义如下:
struct GArray { gchar *data; guint len; }; 然后就可以在这个数组前或者数组后添加数据,添加数据的时候数组也会像C++中的vector容器一样自动增长, 并分配内存。下面我们来看看这一段示例代码:用下面的命令编译程序 gcc -o g_array g_array.c `pkg-config --cflags --libs glib-2.0` 编译后生成可执行文件g_array,执行程序 $./g_array 程序执行结果如下 [plusboy@localhost c]$ ./g_array Create array: 10 11 12 13 14 After append values 30 40 50 60: 10 11 12 13 14 30 40 50 60 After prepend value 1 2 3: 3 2 1 10 11 12 13 14 30 40 50 60 After prepend values -10 -20 -30 -40: -10 -20 -30 -40 3 2 1 10 11 12 13 14 30 40 50 60 After insert 100 at index 5: -10 -20 -30 -40 3 100 2 1 10 11 12 13 14 30 40 50 60 After remove value at index 5: -10 -20 -30 -40 3 2 1 10 11 12 13 14 30 40 50 60 After remove value at index 10 fast: -10 -20 -30 -40 3 2 1 10 11 12 60 14 30 40 50 下面解释一下上面这段代码 我们用函数g_array_new()创建一个数组,它有三个参数:第一个表示是否在数组的尾部添加'/0'结束符; 第二个表示当分配空间给数组元素时是否要把它初始化为‘0’;第三个表示数组里每个元素的长度。 我们用g_array_append_val()向数组中加入数据,这个函数有点像vector容器的push_back()函数,它向数组 的尾部添加数据,如果内存空间不够就自动分配内存。因为g_array_append_val()是一个使用引用的宏, 所以你不能像g_array_append_val(array, 3)这样调用,你必须先把3赋值给一个变量val,然后像 g_array_append_val(array, val)这样调用。 然后用一个display_array()函数打印数组中的元素,这个函数里用到了g_array_index()函数按索引取数组 中的元素,g_array_index()也有三个参数,第一个是要访问的数组,第二个是数组中的数据类型,第三个 是要访问的数组元素的索引。 g_array_append_vals()函数像g_array_append_val()函数一样,向数组尾部添加元素,只是g_array_append_vals() 一次可以添加多个元素。 g_array_prepend_vals()类似于g_array_append_vals(),只是添加的元素位于数组首部。 g_array_insert_val()函数向数组中指定位置插入元素,后面元素按顺序后移。 g_array_remove_index()函数删除数组中指定位置的元素,后面的元素按顺序前移。 g_array_remove_index_fast()函数删除数组中指定位置的元素,数组中的最后一个元素移到该位置,实际上 就是用最后一个元素的值赋给指定元素,然后删除除最后一个元素。所以该函数会改变数组的顺序。 最后不要忘了用g_array_free()删除数组,释放内存空间/* * file: g_array.c * desc: 这个文件用于演示glib库中数组GArray的用法 * compile: gcc -o g_array g_array.c `pkg-config --cflags --libs glib-2.0` */ #include < glib.h > void display_array(GArray * array, int len, const char * prompt) { int i = 0 ; printf( " %s: /n" , prompt); for (i = 0 ; i < len; i ++ ) { printf( " %d " , g_array_index(array, int , i)); } printf( " /n " ); } int main( int argc, char * argv[]) { GArray * array = NULL; int i = 0 ; int cur_arr_len = 0 ; int len = 0 ; array = g_array_new(FALSE, TRUE, sizeof ( int )); len = 0 ; for (i = 10 ; i < 15 ; i ++ ) { g_array_append_val(array, i); len ++ ; } cur_arr_len += len; display_array(array, cur_arr_len, " Create array " ); int app_data[] = { 30 , 40 , 50 , 60 }; int app_len = sizeof (app_data) / sizeof ( int ); g_array_append_vals(array, app_data, app_len); cur_arr_len += app_len; display_array(array, cur_arr_len, " After append values 30 40 50 60 " ); len = 0 ; for (i = 1 ; i < 4 ; i ++ ) { g_array_prepend_val(array, i); len ++ ; } cur_arr_len += len; display_array(array, cur_arr_len, " After prepend value 1 2 3 " ); int prepend_data[] = { - 10 , - 20 , - 30 , - 40 }; int prepend_len = sizeof (prepend_data) / sizeof ( int ); g_array_prepend_vals(array, prepend_data, prepend_len); cur_arr_len += prepend_len; display_array(array, cur_arr_len, " After prepend values -10 -20 -30 -40 " ); int data = 100 ; g_array_insert_val(array, 5 , data); cur_arr_len += 1 ; display_array(array, cur_arr_len, " After insert 100 at index 5 " ); g_array_remove_index(array, 5 ); cur_arr_len -= 1 ; display_array(array, cur_arr_len, " After remove value at index 5 " ); g_array_remove_index_fast(array, 10 ); cur_arr_len -= 1 ; display_array(array, cur_arr_len, " After remove value at index 10 fast " ); g_array_free(array, TRUE); }
glib库的更多参考: http://developer.gnome.org/doc/API/glib/index.html http://developer.gnome.org/doc/API/2.0/glib/index.html