2012-01-23 8 views
1

私は、(優秀な)ドキュメントの後にuthash.hを使用してハッシュテーブルを実装しようとしています。次のコードで動作する追加機能と検索機能を取得できました:C hash-table seg faultの問題

#include <stdio.h> 
#include "../src/uthash.h" 

struct my_struct 
{ 
    int id;     /* key */ 
    char name[10]; 
    double height; 
    UT_hash_handle hh;   /* makes this structure hashable */ 
}; 

/* hash-table declared as a global variable */ 
struct my_struct *users = NULL; /* important! initialize to NULL */ 

void add_user(int user_id, char *name, double height) { 
    struct my_struct *s; 

    s = malloc(sizeof(struct my_struct)); 
    s->id = user_id; 
    strcpy(s->name, name); 
    s->height = height; 
    HASH_ADD_INT(users, id, s); /* id: name of key field */ 
} 

struct my_struct *find_user(int user_id) { 
    struct my_struct *s; 

    HASH_FIND_INT(users, &user_id, s); /* s: output pointer */ 
    return s; 
} 

int main() 
{ 
    add_user(users, 1, "ben", 1.85); 

    struct my_struct *user; 
    user = find_user(users, 1); 

    printf("user id: %d user name: %s height: %g\n", user->id, user->name, user->height); 

    return 0; 
} 

この は良いスタートでしたが、私はグローバル変数として宣言されたハッシュの頭を持つ不幸だったと、パラメータとしての機能を追加するためにそれを渡し、検索したいと思います例えば:

#include <stdio.h> 
#include "../src/uthash.h" 

struct my_struct 
{ 
    int id;     /* key */ 
    char name[10]; 
    double height; 
    UT_hash_handle hh;   /* makes this structure hashable */ 
}; 

void add_user(struct my_struct *users, int user_id, char *name, double height) { 
    struct my_struct *s; 

    s = malloc(sizeof(struct my_struct)); 
    s->id = user_id; 
    strcpy(s->name, name); 
    s->height = height; 
    HASH_ADD_INT(users, id, s); /* id: name of key field */ 
} 

struct my_struct *find_user(struct my_struct *users, int user_id) { 
    struct my_struct *s; 

    HASH_FIND_INT(users, &user_id, s); /* s: output pointer */ 
    return s; 
} 

int main() 
{ 
    /* hash_table declared as a local variable and passed in as a parameter to 
    * add_user and find_user functions */ 
    struct my_struct *users = NULL; /* important! initialize to NULL */ 

    add_user(users, 1, "ben", 1.85); 

    struct my_struct *user; 
    user = find_user(users, 1); 

    printf("user id: %d user name: %s height: %g\n", user->id, user->name, user->height); 

    return 0; 
} 

このバージョンではprintfにSEGフォルトが発生していますが、何も起こっていないようですハッシュテーブルに追加されます。 2番目のバージョンが間違っている場所を実際に見ることはできません。確かに、すべてのハッシュテーブルをグローバル変数として宣言して動作させる必要はありませんか?

は、おそらく何かを明らかに逃した - しかし、あなたは、あなたがそのアドレスを使用する必要があり、関数内のポインタを変更したい場合は、私は

+0

の内側には本当に追加の質問を保証するが、uthashで0有効なハッシュキーではありませんか?私のテストでは、ドキュメントに明示的に記載されているものは見つかりませんでした。 – bph

答えて

4

...それが何であるかを見ることができない ので、機能

add_user(struct my_struct *users, int user_id, char *name, double height) 
、ポインタは変更されないていない場合

add_user(struct my_struct **users, int user_id, char *name, double height) 

なければなりません。もちろん、の

add_user使用

HASH_ADD_INT(*users, id, s) 
+0

'user'がnullでdeferenced(' users'が変更されていないため)されているので 'printf()'でsegfaultsします。 – hmjd

+0

あなたは天才です - 多くの多くの多くのありがとう – bph

関連する問題