我的问题与GLib,C编程有关。 当我初始化struct GHashtable。
struct _GHashTable
{
gint size;
gint mod;
guint mask;
gint nnodes;
gint noccupied; /* nnodes + tombstones */
gpointer *keys;
guint *hashes;
gpointer *values;
GHashFunc hash_func;
GEqualFunc key_equal_func;
gint ref_count;
GDestroyNotify key_destroy_func;
GDestroyNotify value_destroy_func;
};
GHashTable *hash_table;
hash_table = (GHashTable *)malloc(sizeof(GHashTable));
在我的hash_table中,我有三个数组来存储键,值和哈希值。
gpointer *keys;
guint *hashes;
gpointer *values;
我在初始化函数中初始化这些数组:
hash_table->keys = malloc(sizeof(gpointer) * hash_table->size);
hash_table->values = hash_table->keys;
hash_table->hashes = malloc(sizeof(guint) * hash_table->size);
我的问题是当我在分配内存后显示hash_tables时,我发现在values数组中存储了一个数字。
[0] key: (null) hash: 0 values: (null)
[1] key: (null) hash: 0 values: (null)
// Where is the 64273 comes from? Why other array are
// initialized as 0 or null. Only this index is initialized like that?
[2] key: (null) hash: 64273 values: (null)
[3] key: (null) hash: 0 values: (null)
[4] key: (null) hash: 0 values: (null)
[5] key: (null) hash: 0 values: (null)
[6] key: (null) hash: 0 values: (null)
[7] key: (null) hash: 0 values: (null)
我是否必须手动初始化键,值和散列数组,在为它们分配内存后将值分配为0或NULL?
如果没有将它们指定为0或NULL,那么会出现一些随机数或垃圾数?
谢谢。
答案 0 :(得分:5)
您不应该自己初始化GHashTable
。 GHashTable
结构在公共标头中不完整,并且是私有API。它可以更改,恕不另行通您应该调用g_hash_table_new
(或g_hash_table_new_full
),它将分配内存并正确初始化哈希表。
答案 1 :(得分:0)
来自malloc()
的手册页:
malloc()分配大小字节并返回指向已分配的指针 记忆。内存未清除。
因此,为您的结构和数组分配的内存未初始化。它们可以是零或任何其他值。
如果您希望将已分配的内存清零,则需要使用memset
来执行此操作:
hash_table = malloc(sizeof(GHashTable));
memset(hash_table, 0, sizeof(*hash_table));
对于数组,您可以使用calloc
来执行此操作,这也会产生将分配的内存清零的副作用:
hash_table->keys = calloc(hash_table->size, sizeof(gpointer));
hash_table->values = hash_table->keys;
hash_table->hashes = calloc(hash_table->size, sizeof(guint));
另请注意,malloc
函数族的返回值不应该在C中进行类型化。这样做可以隐藏代码中的错误,例如#include <stdlib.h>
失败。在this question获取更多详情。