2D配列の1つの次元を動的に割り当てたい(他の次元が与えられている)。これは機能しますか:
int NCOLS = 20;
// nrows = user input...
double *arr[NCOLS];
arr = (double *)malloc(sizeof(double)*nrows);
そしてそれを解放するには:
free(arr)
完全ではありません-あなたが宣言したのはポインタの配列です。次のように宣言される配列へのポインタが必要です。
double (*arr)[NCOLS];
次に、次のように割り当てます。
arr = malloc(nrows * sizeof(double[NCOLS]));
その後、 2D配列nrows
によって通常として扱うことができます。それを解放するには、他のポインターのようNCOLS
にそれを渡すだけです。free
malloc
Cでは、任意のポインタ型への暗黙のキャストがあるため、の戻り値をキャストする必要void*
はありません(これはC ++では当てはまりません)。実際、そうすること#include <stdlib.h>
で、暗黙の宣言が存在するために失敗するなどのエラーを隠すことができるため、お勧めしません。
データ型double[20]
は「の配列20」でdouble
、型double (*)[20]
は「の配列20へのポインタdouble
」です。このcdecl(1)
プログラムは、複雑なC宣言を解読できるようにするのに非常に役立ちます(例)。
例:
#include <stdio.h>
#include <stdlib.h>
#define COLS 2
void func(int (**arr)[COLS], int rows)
{
int i, j;
*arr = malloc(sizeof(int[COLS]) * rows);
printf("Insert number: \n");
for(i = 0; i < rows; i++)
for(j = 0; j < COLS; j++)
scanf("%d", &(*arr)[i][j]);
for(i = 0; i < rows; i++)
for(j = 0; j < COLS; j++)
printf("%d\n", (*arr)[i][j]);
}
int main(void)
{
int (*arr)[COLS];
func(&arr, 2);
free(arr);
return 0;
}
最初の次元の各要素(各要素は配列へのポインター)に新しい配列を割り当てる必要があります。そのためにループを使用できます。
for(i = 0; i < NCOLS; i++)
arr[i] = (double *)malloc(sizeof(double)*nrows);
解放するために同じことをしてください。