繁体   English   中英

在C中初始化结构GHashTable

[英]Initialize the struct GHashTable in C

我的问题与GLib,C编程有关。 当我初始化结构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,就会出现一些随机数或垃圾数字吗?

谢谢。

您不应该自己初始化GHashTable GHashTable结构在公共标头中不完整,并且是私有API。 如有更改,恕不另行通知。 您应该调用g_hash_table_new (或g_hash_table_new_full ),这将分配内存并正确初始化哈希表。

从手册页中获取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>看看这个问题更多细节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM