使用 CPP 在之后添加新行的动态分配

dynamic allocation using cpp to add new row after

本文关键字:新行 动态分配 添加 之后 CPP 使用      更新时间:2023-10-16

我想将一行添加到以前动态分配的二维数组中,但编译器给出了一个错误,即在我尝试将新内存分配给新行的行中需要左值。

#include<iostream>
//#include<stdlib.h>
using namespace std;
int main()
{
    int (*p)[2] = new (int [5][2]);
    for(int i =0; i<5; i++)
    {
        for(int j =0; j<2; j++)
        {
            p[i][j]= i;
        }
    }
//    p = (int **) realloc(void*, 12)
    int **l = (int **)p;
    (l+5) = new int[1][2];
    p[5][0] = 5;
    p[5][1] = 5;
    for(int i =0; i<=5; i++)
    {
        for(int j =0; j<2; j++)
        {
            cout<<p[i][j];
        }
    }
}

在C++代码中使用 C 样式数组将产生可怕的代码。它很难阅读,很难理解,最糟糕的是:难以维护。这里正确的解决方案似乎是改用std::vector

但是,如果您有理由不使用std::vector(即它是某种学校作业(,您可以做的是用新构建的数组替换原始数组。所以你有一个类型 int (*)[2] 的指针:

// create an array and initialize it:
int (*p)[2] = new (int [5][2]);
for(int i = 0; i < 5; i++)
    for(int j = 0; j < 2; j++)
        p[i][j]= (i+1) * (j+1);

现在,您可以创建一个由相同类型的指针表示的新数组,并重新分配原始指针(此处可以使用连续内存块来复制元素(:

int (*p2)[2] = new (int [6][2]);
memcpy(&p2[0][0], &p[0][0], sizeof(int) * 5 * 2);
delete[] p;                                           // don't forget to clean up
p = p2;

但是现在有一些未初始化的内存可能会导致未定义的行为,因此:

// initialize new row:
for(int j = 0; j < 2; j++)
    p[5][j]= 6*(j+1);

现在您可以打印值并销毁新创建的数组(这可以使用指针p2也可以使用指针p完成(:

for(int i = 0; i < 6; i++)
    for(int j = 0; j < 2; j++)
        std::cout << p[i][j] << ' ';
delete[] p;

打印1 2 2 4 3 6 4 8 5 10 6 12 :)


PS:如果您有未定义memcpy的问题,请尝试#include <cstring>