C GHashTable对两个相同输入的响应完全不同

C GHashTable对两个相同输入的响应完全不同,c,gtk,hashtable,glib,libxml2,C,Gtk,Hashtable,Glib,Libxml2,下面是我能创建的问题的最短可编译演示 查看末尾附近的printf调用,输出如下。我不知道为什么两个完全相同的语句可以做到这一点。它可能与输入类型有关,但我看不出它可能是什么 #include <gtk/gtk.h> #include <libxml/xmlmemory.h> #include <libxml/parser.h> int main (int argc, char *argv[]) { gtk_init (&argc, &a

下面是我能创建的问题的最短可编译演示

查看末尾附近的
printf
调用,输出如下。我不知道为什么两个完全相同的语句可以做到这一点。它可能与输入类型有关,但我看不出它可能是什么

#include <gtk/gtk.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
int
main (int argc, char *argv[])
{
    gtk_init (&argc, &argv);
    GtkBuilder * builder = gtk_builder_new ();
    GHashTable * table = g_hash_table_new(NULL,NULL);
    int i;
    char builderdoc[] = "<?xml version=\"1.0\"?>"
"<interface>"
"  <requires lib=\"gtk+\" version=\"2.16\"/>"
 " <!-- interface-naming-policy project-wide -->"
"  <object class=\"GtkCheckButton\" id=\"checkbutton1\">"
"  </object>"
"</interface>";

    // Load gtkbuilder
    gtk_builder_add_from_string (builder, builderdoc, sizeof(builderdoc),NULL);

    char * buffer[][2] = {
    {"log","checkbutton1"}
    };

    // Load array of widgets into hash table (Shortened)
    for(i = 0; i < sizeof(buffer) / sizeof(char *) / 2; i++){
        g_hash_table_insert(table,(gchar *) buffer[i][0],gtk_builder_get_object (builder, (gchar *) buffer[i][1]));
    }


    // Load xml doc
    xmlDocPtr doc;
    xmlNodePtr cur;
    xmlNodePtr cur2;
    char xmldoc[] = "<?xml version=\"1.0\"?>"
                    "<CsSettings>"
                    "<options>"
                    "<check name=\"log\" value=\"1\" />"
                    "</options>"
                    "</CsSettings>";

    doc = xmlParseMemory(xmldoc, (int) sizeof(xmldoc));
    cur = xmlDocGetRootElement(doc);
    cur = cur->xmlChildrenNode;

    // Find what we're looking for
    while (cur != NULL){
        if(xmlStrEqual(cur->name, (xmlChar *) "options")){
            cur2 = cur->xmlChildrenNode;
            while (cur2 != NULL){
                if(xmlStrEqual(cur2->name, (xmlChar *) "check")){
                    // We've found it, now print some output
                    printf("Plain old lookup: g_hash_table_lookup(table,\"log\"): %p\n",g_hash_table_lookup(table,"log"));
                    printf("Variable lookup : g_hash_table_lookup(table,\"%s\"): %p\n",(gchar *) xmlGetProp(cur2, (xmlChar *) "name"),g_hash_table_lookup(table,(gchar *) xmlGetProp(cur2, (xmlChar *) "name")));
                    printf("Xml says we should lookup: '%s'\n",(gchar *) xmlGetProp(cur2, (xmlChar *) "name"));

                }
                cur2 = cur2->next;
            }
        }       
        cur = cur->next;
    }

}

您可能会从哈希表中获得意外行为,因为您没有在构造函数上设置任何哈希或相等函数,在这种情况下,使用
g_direct_hash()
g_direct_equal()
函数对指针进行直接哈希

如果表的键是
gchar*
我会使用
g_stru hash
g_stru equal
。类似这样的内容初始化您的表:

GHashTable*table=g_hash_table_new(g_str_hash,g_str_equal)


如果哈希表的键是指针所引用的内容,那么对指针进行直接哈希不是一个好主意。请告诉我们这是否解决了问题。

难以置信。我以前用过,但我看不出它的用途。非常感谢:P
Plain old lookup: g_hash_table_lookup(table,"log"): 0x1e369a0
Variable lookup : g_hash_table_lookup(table,"log"): (nil)
Xml says we should lookup: 'log'