【问题标题】:how to pass arbitrary array of structs to a function?如何将任意结构数组传递给函数?
【发布时间】:2015-12-23 01:08:21
【问题描述】:

我正在尝试将任意结构数组传递给函数。它编译得很好,但它什么也没打印。 这是任意结构数组:aFriend *p_array=new aFriend[index]; 函数调用updateTalk(p_array, index);和函数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();
    }
}

【问题讨论】:

  • index 开头是0,所以p_array 将为空。请改用std::vector
  • 如果这是一项学校作业,并且您必须使用指针,或者您需要分配 p_array 以从一开始就包含足够的条目,或者在每次添加条目时重新分配它。
  • 你的数组元素永远不会被初始化..
  • 永远不要递归调用main!使用循环。
  • 使用std::vector简单的解决方案。

标签: c++ arrays struct dynamic-memory-allocation


【解决方案1】:

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

aFriend *p_array=new aFriend[index];

这意味着每次调用它时它实际上都会被重置,这似乎不是你想要的,因为你想保留你的老注册朋友。变量索引在开始时被初始化为零 - 数组从零开始索引,但按您想要的大小进行初始化。那就是:

aFriend *p = new aFriend[1]

将创建一个 size 的数组,然后您可以通过 p[0] 访问第一个元素。

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

【讨论】:

    【解决方案2】:

    我假设您想运行一个循环来处理命令。但是你要做的是在每个命令之后递归调用 main() 。每次调用 main() 都会创建自己的朋友数组实例,该实例是新的和空的。因此,当您添加一个朋友然后打印它时,您实际上打印了一个不同的(和空的)数组。

    这不好有几个原因:

    1. 它不起作用,见上文
    2. 即使您让它工作,它也会泄漏内存并最终崩溃。

    我建议您将 switch 语句放在循环中,并用 break 语句替换 switch 中的 main() 调用。

    【讨论】:

    • 请注意,该标准实际上禁止在程序中使用main
    猜你喜欢
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 2021-03-03
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多