C++ 如何通过动态分配增加阵列中的单元数?

C++ 如何通过动态分配增加阵列中的单元数?,c++,arrays,C++,Arrays,所以我尝试使用动态分配来增加数组中的单元格数量 该数组来自我创建的包含x和y坐标的类型Location 过程是这样的: 我创建了一个大小相同+1的新堆位置数组 我使用for循环将以前的所有位置复制到新阵列 删除上一个指针 将前一个指向新的 我做错了什么 代码如下: void ExtendLocArray(location** ilocPrevArray, int inNumberOfMovements) { // Variable definition location* loc

所以我尝试使用动态分配来增加数组中的单元格数量

该数组来自我创建的包含x和y坐标的类型Location

过程是这样的:

我创建了一个大小相同+1的新堆位置数组 我使用for循环将以前的所有位置复制到新阵列 删除上一个指针 将前一个指向新的 我做错了什么

代码如下:

void ExtendLocArray(location** ilocPrevArray, int inNumberOfMovements)
{
    // Variable definition
    location* locNewPathArray = new location[inNumberOfMovements];
    int       nIndex;

    // Code section

    // Copies the previous locations
    for (nIndex = inNumberOfMovements - 2; nIndex >= 0; nIndex--)
    {
        locNewPathArray[nIndex] = (*ilocPrevArray)[nIndex];
    }

    delete[](*ilocPrevArray);

    (*ilocPrevArray) = locNewPathArray;
}

如果您希望以相反的顺序复制数组的元素,则正确的函数可以按以下方式查看

void ExtendLocArray( location** ilocPrevArray, size_t inNumberOfMovements )
{
    // Variable definition
    location* locNewPathArray = new location[inNumberOfMovements];

    // Copies the previous locations
    for ( size_t i = inNumberOfMovements - 1; i != 0; i-- )
    {
        locNewPathArray[i-1] = ( *ilocPrevArray )[i-1];
    }

    delete [] *ilocPrevArray;

    *ilocPrevArray = locNewPathArray;
}
您可以像这样声明函数

void ExtendLocArray( location * &ilocPrevArray, size_t inNumberOfMovements );
也就是说,您可以使用对指针的引用

这是一个演示程序,我使用typedef作为程序可以编译的名称位置

#include <iostream>

// simplified definition of location
typedef int location;

void ExtendLocArray( location** ilocPrevArray, size_t inNumberOfMovements )
{
    // Variable definition
    location* locNewPathArray = new location[inNumberOfMovements];

    // Copies the previous locations
    for ( size_t i = inNumberOfMovements - 1; i != 0; i-- )
    {
        locNewPathArray[i-1] = ( *ilocPrevArray )[i-1];
    }

    delete [] *ilocPrevArray;

    *ilocPrevArray = locNewPathArray;
}

int main() 
{
    const size_t N = 10;
    location *p = nullptr;

    for ( size_t i = 0; i < N; i++ )
    {
        ExtendLocArray( &p, i + 1 );
        p[i] = i;
    }

    for ( size_t i = 0; i < N; i++ ) std::cout << p[i] << ' ';
    std::cout << std::endl;

    delete [] p;

    return 0;
}
请注意,您可以使用头中声明的标准算法std::copy_backward,而不是自己编写循环。比如说

#include <algorithm>

//...
std::copy_backward( *ilocPrevArray, 
                    *ilocPrevArray + inNumberOfMovements - 1, 
                    locNewPathArray + inNumberOfMovements - 1 );    

你为什么反向循环?为什么要从numberofmovements-2开始,而不是从numberofmovements-1开始?在提问时,请说明运行代码时会发生什么,以及这与您的预期有何不同。像这个代码有什么问题?不是建设性的。如果这不能让你欣赏std::vector v;,简单来说就是:v.调整移动次数;,没有什么能改变。我无缘无故地倒转,只是练习。这是-2,因为我想复制所有以前的位置,并为新位置保留最后一个打开的位置。我的期望是,我的新数组将包含所有以前的位置,并且一个新的位置作为数组中的最后一个单元格,其中没有任何值。对于12个问题,是1。2是2,它是alist@KesemDavid你打算如何填充新添加的元素,还是将其取消初始化?@Kesem David事实上是一样的,但它更好。我看到它更清晰,但为什么它不起作用?调试时,当我第二次使用delete[]时,程序崩溃。@Kesem David可能是您忘记了将指针初始化为NULL。@Kesem David最初的指针ilocPrevArray应该由NULL或nullptr初始化。见我更新的帖子。
#include <algorithm>

//...
std::copy_backward( *ilocPrevArray, 
                    *ilocPrevArray + inNumberOfMovements - 1, 
                    locNewPathArray + inNumberOfMovements - 1 );