插入指针数组会删除上一个结果


#include <bits/stdc++.h>
using namespace std;
typedef struct contact
{
char *name;
char *number;
char *birthday;
char *email;
char *memo;
}contact;
contact *contacts;
int total=0;
void initDB()
{
contacts = new contact[50001];
}
void Add(char *name,char *number,char *birthday,char *email,char *memo)
{
contacts[total].name = name;
contacts[total].number = number;
contacts[total].birthday = birthday;
contacts[total].email = email;
contacts[total].memo = memo;
total++;
}
int main()
{
initDB();
char name[20];
char number[20];
char birthday[20];
char email[20];
char memo[20];
for (int i = 0; i < 4; ++i)
{
cin >> name>>number>>birthday>>email>>memo;
Add(name,number,birthday,email,memo);
}
cout << contacts[0].memo<<" "<<contacts[1].memo<< endl;
return 0;
}

我使用new contact[50001]创建了一个数组指针; 假设我有这样的输入

A 111 0101 a.com aaa
B 222 0202 b.com bbb
C 333 0303 c.com ccc
D 444 0404 d.com ddd

当我打印第一插入第二行时,它会删除所有以前的记录。我的代码的输出是ddd ddd。我怎样才能得到想要的结果?提前谢谢。

您不是在复制name等的内容 - 您只是存储指向它们的指针。在main中更改name的内容后,以前的内容将丢失,因为您没有复制它。

解决此问题C++是使用std::string而不是char*,这将为您进行复制。当你使用它时,你也可以使用std::vector(如std::vector<contact> contacts;),你甚至不必做任意的、浪费的、仍然危险的contacts = new contact[50001];

正如评论者之前所说,根据输出,您只需将所有联系人指向main()中的同一局部变量即可。

要解决此问题,您应该重新设计contact类,以便它拥有资源来存储来自每个输入的数据。 要么将字段变成这样的类(这在意识形态上更可取)。如果你必须"裸体",你可以自由地设计自己的,尽管C++已经提供了所有工具。

您必须了解 c++ 指针表示法的基本原理及其工作原理。 您可以使用指向另一个位置的新实例化新对象。有关更多详细信息,您可以看到,指针深入

最新更新