C++ 如何将结构的任意数组传递给函数?

C++ 如何将结构的任意数组传递给函数?,c++,arrays,struct,dynamic-memory-allocation,C++,Arrays,Struct,Dynamic Memory Allocation,我试图将结构的任意数组传递给函数。它编译得很好,但不打印任何内容。 这是结构的任意数组:aFriend*p_array=newafriend[index] 函数调用updateTalk(p_数组,索引)和函数void updateTalk(aFriend an_array[],int a_size) 下面是整个代码: #include <iostream> using namespace std; struct aFriend { string name; int

我试图将结构的任意数组传递给函数。它编译得很好,但不打印任何内容。 这是结构的任意数组:
aFriend*p_array=newafriend[index]
函数调用updateTalk(p_数组,索引)
和函数
void updateTalk(aFriend an_array[],int a_size)

下面是整个代码:

#include <iostream>

using namespace std;

struct aFriend
{
    string name;
    int days_ago=0;
};

aFriend addFriend(int& index)
{
    aFriend newFriend;
    cout<<"Enter friend's name:\t";
    cin>>newFriend.name;
    do{
    cout<<"How many days ago you talked with him/her:\t";
    cin>>newFriend.days_ago;
    } while (newFriend.days_ago<=0);
    index++;
    return newFriend;
}

void updateTalk(aFriend an_array[], int a_size)
{
    cout<<"an_array[0].name="<<an_array[0].name<<endl;
    cout<<"Select one of the following names:\n";
    for(int i=0;i<a_size;i++)
    {
        cout<<"1. "<<an_array[i].name;
    }
    cout<<endl;
}

void printList()
{

}
int index=0;
int main()
{
    cout<<"1. Add friend\n2. Update last talk\n3. Print list\n4. Exit\n";
    int pick;
    cin>>pick;
    aFriend *p_array=new aFriend[index];
    switch (pick)
    {
        case 1: addFriend(index);return main();
        case 2: updateTalk(p_array, index); return main();
        case 3: printList(); return main();
        case 4: return 0;
        default: cout<<"Error! Please select one of the available options!\n"; return main();
    }
}
#包括
使用名称空间std;
结构朋友
{
字符串名;
int days_ago=0;
};
aFriend addFriend(int和index)
{
朋友和新朋友;
coutnewFriend.name;
做{
几天前的朋友;

}while(newFriend.days\u ago我假设您想运行一个循环来处理命令。但是您要做的是在每个命令之后递归调用main()。main()的每次调用都会创建自己的friends数组实例,该实例是新的且为空的。因此,当您添加一个friend并打印它时,实际上打印的是不同的(且为空的)数组

这是不好的,有几个原因:

  • 它不起作用,见上文
  • 即使你让它工作,它也会泄漏内存,最终崩溃

  • 我建议您将switch语句放在一个循环中,并替换main()使用break语句在交换机内部调用。

    这种代码处理方法存在多个问题。实际上,您尝试执行的操作非常直观,因此我理解您的困惑。但是,主要问题是每次调用main()时都会重新分配存储好友的数组:

    aFriend *p_array=new aFriend[index];
    
    这意味着每次调用它时,它实际上都会被重置,这似乎不是您想要的,因为您希望保留已注册的老朋友。变量索引在开始时初始化为零-数组从零开始索引,但按您想要的大小初始化。即:

    aFriend *p = new aFriend[1]
    
    将创建一个大小为1的数组,该数组是p[0]可以访问的第一个元素


    为了解决您的问题,您可以使用std::vector作为一个可以改变大小的数组,也可以在开始时创建“足够大”的数组。您不能调整标准数组的大小。此外,为了避免调用main,您可以使用while循环,条件是(pick!=4).

    索引
    在开始时为
    0
    ,因此
    p_数组
    将为空。请改用
    std::vector
    。如果这是学校作业,您必须使用指针,或者您需要分配
    p_数组
    ,以从一开始就包含足够的条目,或者每次添加条目时重新分配它。您的数组元素永远不要初始化。永远不要递归调用
    main
    !使用循环。使用是简单的解决方案。请注意,标准实际上禁止在程序中使用
    main