Проблема с ошибкой сегмента C-таблицы - PullRequest
1 голос
/ 23 января 2012

Я пытался реализовать хеш-таблицы с помощью uthash.h, следуя (превосходной) документации, я смог получить функции add и find для работы со следующим кодом:

#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;
}

это было хорошее начало, но я был недоволен тем, что заголовок хеша объявлен как глобальная переменная, и хотел бы передать его в функции add и find в качестве параметра, например ::1004*

#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;
}

эта версия вызывает ошибку SEG в printf, похоже, что ничего не было добавлено в хеш-таблицу. действительно не могу видеть, где вторая версия идет не так, как надо. неужели не обязательно объявлять все ваши хеш-таблицы как глобальные переменные, чтобы заставить их работать?

вероятно пропустил что-то очевидное - но я не вижу, что это ...

1 Ответ

4 голосов
/ 23 января 2012

Если вы хотите изменить указатель внутри функции, вы должны использовать ее адрес Итак, функция

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 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...