簡體   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