【问题标题】:storing data in addresses and changing the address of a variable in C?将数据存储在地址中并更改C中变量的地址?
【发布时间】:2012-02-06 06:26:35
【问题描述】:

新手,

我有一个单词的结构,其中包含单词本身的 char 数组(该结构有其他函数,与我的问题无关),我试图将它存储在一个哈希图中,这是一个数组字结构指针。在我的程序中,每次我看到一个新单词时,我都会创建一个新单词结构并 malloc char-array 来创建它。然而,在循环运行几次之后,它会将旧词更改为新词,即使它位于不同的哈希图位置。

我想知道是否有可能让我创建新单词结构的循环指向一个新地址?

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 个存储橙色的插槽,这不是我想要的。我该如何解决这个问题?

【问题讨论】:

  • 如何获取hashf的值?它曾经改变过吗?
  • 当使用b &lt; strlen(LowerCaseCopy) 时,您只是迭代到比字符串长度小一,因此不会复制完整的字符串。您也不要设置/复制字符串终止符。您的实际问题可能与您尝试为两个单词重用相同的变量有关,尝试使用不同的变量。
  • 是的,hashf 正在发生变化,这只是我的代码的一部分,我将这部分放在一个循环中。如果我在循环的每次迭代中重用变量,那不会改变地址吗?
  • 我的意思是你不能重用变量add,因为它的地址不会改变。如果您将多个条目设置为&amp;add,那么这些条目将指向一个结构。
  • 有什么方法可以初始化它,以便每次外循环迭代时我可以有不同的地址?

标签: c memory-address


【解决方案1】:

一个简单的解决方案(我认为)是将向哈希映射添加条目的功能放在一个单独的函数中。此函数分配一个新的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),您必须记住先释放它。

【讨论】:

  • 太棒了!如果可以,我会拥抱你!非常感谢!感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 2014-09-07
  • 2018-08-26
相关资源
最近更新 更多