C++ C++;向数组中添加元素

C++ C++;向数组中添加元素,c++,arrays,dynamic,C++,Arrays,Dynamic,这是我编程课作业的一部分。老师希望我们创建两个函数,其中一个将向现有的动态结构数组添加元素,这就是我遇到的问题 根据我在网上找到的不同帖子,以下是我对该功能应该如何工作的理解: 创建一个比现有阵列大的新阵列 将旧数组的内容复制到新数组 将新元素添加到新数组中 销毁旧阵列 然而,有些地方出了问题,程序崩溃了——我认为问题在于我尝试执行第3点和第4点的方式。有人能看一下吗?我真的很感激任何帮助 编辑:忘了提到,老师希望函数设置为void,它们应该不会返回任何内容 代码如下: const int si

这是我编程课作业的一部分。老师希望我们创建两个函数,其中一个将向现有的动态结构数组添加元素,这就是我遇到的问题

根据我在网上找到的不同帖子,以下是我对该功能应该如何工作的理解:

  • 创建一个比现有阵列大的新阵列

  • 将旧数组的内容复制到新数组

  • 将新元素添加到新数组中

  • 销毁旧阵列

  • 然而,有些地方出了问题,程序崩溃了——我认为问题在于我尝试执行第3点和第4点的方式。有人能看一下吗?我真的很感激任何帮助

    编辑:忘了提到,老师希望函数设置为void,它们应该不会返回任何内容

    代码如下:

    const int size = 2;
    
    struct Player {
        string name;
        string kind;
    };
    
    void addplayer(Player * plarr, int size) {
    
        cout << "Adding a new element to the array" << endl << endl;
    
        //creating a new, bigger array:
        Player * temp = NULL;
        temp = new Player[size+1];
    
        //copying the content of the old array
        for (int i=0;i<size;i++) {
            temp[i].name = plarr[i].name;
            temp[i].kind = plarr[i].kind;   
        }
    
        //adding the new element:
        string name, kind;
        cout << "Choose the name for the new player: " << endl;
        cin >> name;
        cout << "Choose the class for the new player: " << endl;
        cin >> kind;
    
        temp[size+1].name = name;
        temp[size+1].kind = kind;
    
        //deleting the old array, replacing it with the new one
        delete[] plarr;     
        plarr = temp; 
    
    }
    
    const int size=2;
    结构播放器{
    字符串名;
    弦类;
    };
    void addplayer(播放器*plarr,整数大小){
    库特
    
    plarr
    参数通过值传递给此函数

    此函数用于分配新数组并正确复制内容,但有一个错误除外:

    temp[size+1].name = name;
    temp[size+1].kind = kind;
    
    这里的索引应该是
    大小
    。但最大的错误是函数的结论是:

        delete[] plarr;     
        plarr = temp; 
    }
    
    不幸的是,由于
    plarr
    是通过值传递的,因此所做的只是将此函数的
    plarr
    参数设置为新指针,然后返回

    它完全不起任何作用,因为这个函数的调用方仍然有它原来的指针。它现在被销毁了

    您应该将此函数更改为
    返回
    调用者需要保存的新指针,而不是原始指针

    plarr
    参数通过值传递给此函数

    此函数用于分配新数组并正确复制内容,但有一个错误除外:

    temp[size+1].name = name;
    temp[size+1].kind = kind;
    
    这里的索引应该是
    大小
    。但最大的错误是函数的结论是:

        delete[] plarr;     
        plarr = temp; 
    }
    
    不幸的是,由于值传递了
    plarr
    参数,因此所有这些操作都将
    plarr
    参数设置为新指针,并返回

    它完全不起任何作用,因为这个函数的调用方仍然有它原来的指针。它现在被销毁了



    您应该将此函数更改为
    返回
    调用者需要保存的新指针,而不是原始指针。

    为什么不使用
    std::vector
    -辛苦了!@EdHeal老师禁止了它,sadly@EdHeal:这对动态分配在引擎盖下的工作方式没有太大的指导意义,是吗?N如果你使用了<代码> > SiZeZt而不是<代码> int >代码>数组大小。它与C++的其他位更兼容。也可以看RAII。在这种情况下,你可以构建一个PraveReX数组类来在销毁时自动地管理和删除数组。为什么不使用<代码> STD::vector < /代码>-为你做了艰苦的工作!@EdHeal老师禁止了它,sadly@EdHeal对于动态分配在引擎盖下工作的指导意义不大,不是吗?但是如果你使用<代码> siZeZt而不是< C++ >代码> >数组大小,事情会比较容易。它与C++的其他位更兼容。。再看看RAII。在这种情况下,您可以构建一个Player_数组类来管理并在销毁时自动删除数组。遗憾的是,老师希望我们编写不返回任何内容的函数。换句话说,它们都应该具有void类型-抱歉,我可能应该在我的问题中提到这一点:(无论如何,非常感谢您的帮助!如果OP返回新指针的值,则调用必须变成
    plarr=newPlayer(plarr,size++);
    。我个人会通过引用传递指针和大小,增加函数中的大小,因此声明为
    void newPlayer(Player*&plarr,size\u t&size)
    。如果你不称职的老师想让你写糟糕的代码,你唯一的选择就是通过引用传递参数,而不是值。是的,通过引用传递成功了,非常感谢大家!遗憾的是,老师希望我们编写不返回任何内容的函数。换句话说,它们都应该是void type-对不起,我可能应该使用mentio在我的问题中:(非常感谢你的帮助!如果OP返回新指针的值,调用必须变成
    plarr=newPlayer(plarr,size++);
    。我个人会通过引用传递指针和大小,在函数中增加大小,因此声明为
    void newPlayer(Player*&plarr,size\u t&size)
    。如果你不称职的老师想让你写糟糕的代码,你唯一的选择就是通过引用传递参数,而不是值。是的,通过引用传递成功了,非常感谢大家!