GArray не очищается при инициализации, как ожидалось - PullRequest
1 голос
/ 26 февраля 2011

У меня было какое-то странное поведение Glib, я немного искал в интернете и нашел это руководство по Glib , второй блок кода, который будет конкретным:

//ex-garray-2.c
#include <glib.h>
#include <stdio.h> // I added this to make it compile
int main(int argc, char** argv) {
    GArray* a = g_array_sized_new(TRUE, TRUE, sizeof(int), 16);
    printf("Array preallocation is hidden, so array size == %d\n", a->len);
    printf("Array was init'd to zeros, so 3rd item is = %d\n",
        g_array_index(a, int, 2));
    g_array_free(a, FALSE);

    // I removed some code here

    return 0;
}

Итак, ожидаемый результат должен быть

Array preallocation is hidden, so array size == 0
Array was init'd to zeros, so 3rd item is = 0

но я получаю

Array preallocation is hidden, so array size == 0
Array was init'd to zeros, so 3rd item is = 901959560

Я использую Gentoo Linux ~ amd64 (64-битная версия, тестирование) с gcc 4.5.3, glibc 2.13 и glib 2.26.1. Я скомпилировал программу, используя gcc $(pkg-config --cflags --libs glib-2.0) -o ex-garray-2 ex-garray-2.c

Есть идеи, почему я получаю наблюдаемое поведение, а не ожидаемое?

Ответы [ 2 ]

3 голосов
/ 26 февраля 2011

Я не очень знаком с GLib, но я нашел его документацию очень вводящей в заблуждение: флаг clear_ в g_array_sized_new фактически определяет, как ведет себя g_array_set_size, т. Е. Устанавливает ли он биты в ноль или нет при настройке размера массива .Действительно, в документации GLib говорится, что

g_array_sized_new создает новый массив GArray с предварительно выделенными элементами reserved_size и счетчиком ссылок 1. Это позволяет избежать частого перераспределения, еслидобавить много элементов в массив. Обратите внимание, что размер массива по-прежнему равен 0.

Поэтому вы пытаетесь получить доступ к элементу, индекс которого больше размера массива.Попробуйте сначала установить размер массива, используя g_array_set_size (a,16), и только тогда вы сможете получить доступ к третьему элементу.

0 голосов
/ 22 ноября 2011

Документация IBM неверна.Вы должны разыменовать g_array_index () следующим образом:

printf("%d\n", &g_array_index(array, type, index));

См. http://developer.gnome.org/glib/2.28/glib-Arrays.html#g-array-index

...