0

以前に動的に割り当てられた 2 次元配列に行を追加したかったのですが、新しい行に新しいメモリを割り当てようとしている行で左辺値が必要であるというエラーがコンパイラによって表示されます。

#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 に答える