c++ - 相同的地址被存储在链表的头部
问题描述
我正在尝试在 C++ 中实现哈希表。所以为此,我创建了一个链表数组。但是我在维护每个列表的头部时遇到了问题。
我有一个名为linked_list ContactList
,列表的数组在另一个名为的类中定义PhoneBook
:
class ContactList {
public:
Contact *head;
void AddName(Contact *);
};
class PhoneBook {
public:
ContactList arr[100000];
};
它应该包含以下列方式定义的节点:
struct Contact {
int phone;
string name;
Contact *next;
};
该AddName
函数应该遍历整个列表以找到具有相同编号的节点,如果找到该节点,则只需修改node.name
,否则将其添加到列表的末尾。我编写了以下代码来执行此操作:
void ContactList::AddName(Contact *contact){
bool flag = 0;
Contact *node = head;
if(node == NULL){
head = contact;
return;
}
...
}
函数调用AddName
如下所示:
Contact contact{queries[i].number, queries[i].name};
phonebook.arr[k].AddName(&contact);
但问题是每次调用时参数的地址contact
都是相同的,因此相同的地址存储在每个索引的每个列表的头部。如何更改调用以分配新内存?或者我应该在我的AddNew
函数中改变一些东西?
编辑:我发现我没有分配新内存,所以我寻找解决方案并进行了以下更改:
void ContactList::AddName(Contact contact){
bool flag = 0;
struct Contact *new_node = (struct Contact *) malloc(sizeof(struct Contact));
new_node->phone = contact.phone;
new_node->name = contact.name;
if(head == NULL){
head = new_node;
return;
}
但是现在我在以下行中遇到了分段错误:
new_node->name = contact.name;
解决方案
这里的问题是您正在创建一个堆栈变量,然后将其地址添加到列表中。然后也许您更改值并再次添加它。
为了实现您想要的行为,您必须在每个条目处创建新实例。为此,您可以使用new
创建不同的联系人。
Contact* contact = new Contact;
更好的是使用智能指针来管理内存并确保没有内存泄漏。
std::unique_ptr<Contact> contact = std::make_unique<Contact>();
推荐阅读
- azure - Azure 数据工厂 - 设置 blob 容器的元数据以及“复制”活动
- amazon-web-services - 如何将 PATH 导出到“sam build”命令?
- flutter - 是否有任何 SDK 在 Flutter 中我们可以在同一屏幕上看到七个直播流媒体?
- hibernate - Hibernate:添加强制谓词
- javascript - API 仅在我开始输入后呈现(Firebase)
- java - Java中的多维数组到JSON(和返回)
- visual-studio-code - VSCode API 中是否有可以检查语言服务器是否可用于给定语言的命令?
- python - Numba 矢量化与常数的参与
- swiftui - 使用“导航链接”在“导航视图”之间导航
- python - 如何使用python在json文件中查找键值包含相同值的次数