хранение данных в адресах и изменение адреса переменной в C? - PullRequest
0 голосов
/ 06 февраля 2012

Новичок здесь,

У меня есть структура для слова, которая содержит массив символов для самих слов (структура имеет другие функции, не связанные с моим вопросом), и я пытаюсь сохранитьэто в хэш-карте, которая является массивом указателей структуры слова.В моей программе каждый раз, когда я вижу новое слово, я создаю новую структуру слова и собираю массив символов char для его создания.Однако после нескольких прогонов цикла оно заменяет старое слово новым, даже если оно находится в разных местах hashmap.

Что мне интересно, так это возможно ли иметь цикл, в котором я создаю новую структуру слова, указывающую на новый адрес?

struct words add;
int b;
for(b = 0; b < strlen(LowerCaseCopy); b++)
{
    add.word[b] = '\0';
}
for(b=0;b< strlen(LowerCaseCopy);b++)
{
add.word[b] = LowerCaseCopy[b];
}
hashmap[hashf] = &add;

Это код, о котором идет речь.

Пример моей проблемы: при первом прохождении цикла я устанавливаю add.word в apple, который хранится в определенном слоте hashmap.В следующем цикле я установил add.word в оранжевый, который хранится в другом слоте.Проблема в том, что в первом слоте он больше не хранит яблоко, он вместо этого хранит оранжевый, поэтому у меня есть 2 слота, которые хранят оранжевый, а это не то, что я хочу.Как мне это исправить?

1 Ответ

0 голосов
/ 06 февраля 2012

Простое решение (я думаю) состояло бы в том, чтобы поместить функциональность для добавления записей в хэш-карту в отдельную функцию. Эта функция выделяет новую структуру words и помещает ее в хэш-карту:

void add_to_hashmap(struct something *hashmap, char *lower_case_word)
{
    /* Using "calloc" we don't have to manually clear the structure */
    struct words *words = calloc(1, sizeof(struct words));

    /* Copy +1 to include the terminating '\0' */
    memcpy(words->word, lower_case_word, strlen(lower_case_word) + 1);

    /* Replace this with whatever you use to calculate the hash */
    int hashf = calculate_hash(lower_case_word);

    hashmap[hashf] = words;
}

Если вы удаляете запись (т. Е. Устанавливаете ее на NULL), вы должны сначала не забыть ее освободить.

...