C哈希表段错误问题

标签 c hashtable

我一直在尝试使用 uthash.h 实现哈希表,遵循(优秀的)文档我已经能够使用以下代码获得添加和查找函数:

#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 错误,看起来哈希表中没有添加任何内容。真的看不出第二个版本哪里出了问题。肯定不是必须将所有哈希表声明为全局变量才能使其工作吗?

可能遗漏了一些明显的东西 - 但我看不到它是什么......

最佳答案

如果你想在函数内部修改一个指针,你必须使用它的地址 所以,函数

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 )

关于C哈希表段错误问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8974265/

相关文章:

c - 使用 STRCPY C

c++ - 散列和访问

c - "Bad permissions for mapped region at address"哈希表的 Valgrind 错误

java - 如何找到不同的流派然后添加到数组链表中

c++ - c++ 中的 curl_easy_perform 停止用于其他用途的计时器。

c - 传递二维数组时发出警告

c - *a++ = *b++ = 0 安全吗

c - 试图打印数组的最大值..但打印垃圾

python - 键对于 python 字典来说不是唯一的!

javascript - v8 如何对哈希表中的键进行哈希处理