我最近开始学习C语言,并且我正在try 实现哈希图数据 struct . 我目前正在将我的桶实现为动态子菜单数组支持的列表. 当测试我的bucket_remove函数时,我在测试代码中犯了一个我很难理解的错误.
这是我的new_entry
功能:
struct Entry *new_entry(char *id)
{
struct Entry *e = (struct Entry *)malloc(sizeof(struct Entry));
e->id = id;
return e;
}
这是我的test_remove
功能:
static char *test_remove()
{
struct Bucket *b = new_bucket();
for (int i = 0; i < 5; i++)
{
char id[8];
snprintf(id, 8, "entry-%d", i);
struct Entry *e = new_entry(id);
bucket_add(b, e);
}
printf("Entry 0 id: %s.\n", b->_entries[0]->id);
printf("Entry 1 id: %s.\n", b->_entries[1]->id);
// ... rest of code omitted for clarity
}
在每次迭代的循环内,都会创建具有正确id的新条目,但之前条目的id随后会更新为最近的id. 因此,控制台打印:
Entry 0 id: entry-4.
Entry 1 id: entry-4.
我相信这与我将本地id
缓冲区传递给我的new_entity
函数的方式有关.每个条目必须接收指向同一内存的指针.但我不太明白为什么会这样.
这就是我理解循环中代码的方式:
-
char id[8];
-堆栈中分配了8个字符的内存,地址分配给id
. -
snprintf(id, 8, "entry-%d", i);
-指向id
缓冲区的指针被传递给snprintf
,后者用创建的字符串的字符填充它. -
struct Entry *e = new_entry(id);
-指向id
缓冲区的指针被传递给new_entry
,其中在堆上分配新的Entry struct ,并将id
(指针)分配给其id
成员. -
bucket_add(b, e);
-指向桶的指针和指向条目的指针被传递给bucket_add
,并将条目(指针)添加到桶的条目数组中.
当发生新的迭代时,看起来就像分配了新的内存部分,并且其新的内存地址被分配给本地范围中的新变量.那么如何覆盖以前的内存呢?
如果有人能澄清我的理解,我将不胜感激.