0

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

#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];
        }
    }

}
4

1 回答 1

0

在 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>

于 2013-08-28T07:45:25.147 回答