以下代码段来自The Official GNOME 2 Developer's Guide:
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
个内存块
为什么他们在这里使用gchar *?在运行data[i] = g_mem_chunk_alloc(my_chunk);
时是否会发生从gpointer(void *)到gchar *的隐式转换?
如果以上语句为真,则每个gchar *指向42字节的内存。那么如何访问特定原子的所有字节呢? data[7]+41
将成为可用的内存位置吗?
当我尝试编译代码时,gcc会产生以下错误消息:
error: storage size of ‘my_chunk’ isn’t known
怎么了?
答案 0 :(得分:3)
按您的问题顺序:
void *
可以隐式转换为C中的任何其他指针类型,这通常被认为是好的C风格。他们在这里使用gchar *
,因为他们显然希望将每个原子视为42 gchar
s的数组。data[7][41]
是第8个原子的最后一个可访问字节。错误是因为my_chunk
的声明错误(GMemChunk
是一种不透明的类型,不应在代码中直接实例化)。声明应该是:
GMemChunk *my_chunk;
根据g_mem_chunk_new()
和g_mem_chunk_alloc()
的签名。
顺便说一句,Glib文档声明不推荐使用Chunk分配器,而应该使用切片分配器。