Следующий фрагмент кода взят из Официальное руководство разработчика по GNOME 2 :
GMemChunk my_chunk; my_chunk = g_mem_chunk_new("My Chunk", 42, 42*16, G_ALLOC_AND_FREE); gchar *data[50000]; gint i; /* allocate 40,000 atoms */ for(i = 0; i < 40000; i++) { data[i] = g_mem_chunk_alloc(my_chunk); }
Означает ли это, что каждый атом имеет 42 байта, каждый «блок памяти» содержит 42 16 атомов, и 40000/16=2500 фрагменты памяти будут созданы при запуске кода выше? *
40000/16=2500
Почему они используют gchar * здесь? Происходит ли неявное приведение из gpointer (void *) к gchar * при запуске data[i] = g_mem_chunk_alloc(my_chunk);?
data[i] = g_mem_chunk_alloc(my_chunk);
Если приведенное выше утверждение верно, то каждый gchar * указывает на 42 байта памяти. Как мне получить доступ ко всем байтам определенного атома? data[7]+41 будет использоваться в памяти?
data[7]+41
Когда я пытаюсь скомпилировать код, gcc выдает следующее сообщение об ошибке:
error: storage size of ‘my_chunk’ isn’t known Что не так?
error: storage size of ‘my_chunk’ isn’t known
В порядке ваших вопросов:
void *
gchar *
gchar
data[7][41]
Ошибка в том, что объявление my_chunk является неправильным (GMemChunk является непрозрачным типом, который не должен непосредственно создаваться в вашем коде). Декларация должна быть:
my_chunk
GMemChunk
GMemChunk *my_chunk;
согласно подписи g_mem_chunk_new() и g_mem_chunk_alloc().
g_mem_chunk_new()
g_mem_chunk_alloc()
Кстати, документация Glib гласит, что распределитель чанков устарел, и вместо него следует использовать распределитель слайсов.