割り当てパターンでは、2 番目のループで複数の割り当てが行われるため、単純なコピーを行うことはできません。それはあなたが本当に何を求めているかによります。現在の 1D 配列にポインターを設定して、2D 配列としてアクセスできるようにすることで、一連のポインターの割り当てを 1 つだけ行うように調整できます。または、1D 配列のコピーを作成してから、ポインターを設定することもできます (2 つの割り当て、1 つのコピー、1 つの初期化ループ)。唯一の問題は元の割り当てをコピーするかどうかであるため、主な答えは元のデータで機能します。
あなたが持っている:
int N, A, B;
A = ...;
B = ...;
N = A * B;
double *a_1d = malloc(N * sizeof(double));
...check and load a_1d...
これで、次の方法で 2D '配列' を作成できます。
double **a_2d = malloc(A * sizeof(double *));
...check that allocation succeeded...
for (int i = 0; i < A; i++)
a_2d[i] = &a_1d[i * B];
この初期化が完了すると、次を使用できるようになります。
for (int i = 0; i < A; i++)
for (int j = 0; j < B; j++)
a_2d[i][j] = ...;
元の配列を複製する必要がある場合はa_1d
、次を追加します。
double *a_1d_copy = malloc(N * sizeof(double));
...check that the allocation succeeded...
memmove(a_1d_copy, a_1d, N * sizeof(double));
設定a_1d_copy
の代わりに参照できます。a_1d
a_2d
何かを解放するときが来たら、両方を解放する必要があることを忘れないでくださいa_1d
(a_2d
そしてa_2d_copy
、それを使用している場合)。