Создание таблицы ha sh с> 1 байтовыми ключами и значениями в C - PullRequest
1 голос
/ 09 мая 2020

Я пытаюсь создать таблицу ha sh в C с нуля. Вот таблица ha sh с 1 байтовыми (char*) ключами и значениями Я хочу создать, за исключением того, что я хочу, чтобы моя таблица ha sh хранила ключи и значения в виде строк до 32 символов длинный (char key[32], char value[32]). Вот мой struct:

#define KV_SIZE 32

typedef struct hash_entry{
    char key[KV_SIZE];
    char value[KV_SIZE];
    struct hash_entry* next;
} hash_entry;

У меня возникли проблемы с формированием функции с именем create_entry(), потому что я не знаю, как присвоить значениям мои struct строки, ключ и значение.

// create an entry
hash_entry* create_entry(char key[KV_SIZE], char value[KV_SIZE]){
    printf("%s\n", key);
    hash_entry* entry = (hash_entry*)malloc(sizeof(hash_entry*));

    // I want entry->key and entry->value to store a string up to 32 chars long
    strncpy(entry->key, key, strlen(key)); // Error
    strncpy(entry->value, value, strlen(value)); // Error

    entry->next = NULL;

    return entry;
}

Пока что мне кажется, что мне нужно, чтобы мои entry оставались объявленными как указатели (hash_entry* entry), а не не-указатели (hash_entry entry), чтобы иметь возможность связывать их позже.

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Вот что исправило мой код:

hash_entry* create_entry(char key[HASH_SIZE], char value[HASH_SIZE]){
    // No casting needed and don't use sizeof(pointer)
    // use sizeof(hash_entry) to get the full size of your struct
    hash_entry* entry = malloc(sizeof(hash_entry));

    // aside: don't forget to check the size of your strings
    if(strlen(key) < KV_SIZE && strlen(value) < KV_SIZE){
        // use strcpy instead of strncpy
        strcpy(entry->key, key);
        strcpy(entry->value, value);
        entry->next = NULL;

        return entry;
    }
    return NULL;
}
0 голосов
/ 09 мая 2020
hash_entry* entry = (hash_entry*)malloc(sizeof(hash_entry));
...