3

2D配列の1つの次元を動的に割り当てたい(他の次元が与えられている)。これは機能しますか:

int NCOLS = 20;

// nrows = user input...

double *arr[NCOLS];

arr = (double *)malloc(sizeof(double)*nrows);

そしてそれを解放するには:

free(arr)
4

3 に答える 3

6

完全ではありません-あなたが宣言したのはポインタの配列です。次のように宣言される配列へのポインタが必要です。

double (*arr)[NCOLS];

次に、次のように割り当てます。

arr = malloc(nrows * sizeof(double[NCOLS]));

その後、 2D配列nrowsによって通常として扱うことができます。それを解放するには、他のポインターのようNCOLSにそれを渡すだけです。free

mallocCでは、任意のポインタ型への暗黙のキャストがあるため、の戻り値をキャストする必要void*はありません(これはC ++では当てはまりません)。実際、そうすること#include <stdlib.h>で、暗黙の宣言が存在するために失敗するなどのエラーを隠すことができるため、お勧めしません。

データ型double[20]は「の配列20」でdouble、型double (*)[20]は「の配列20へのポインタdouble」です。このcdecl(1)プログラムは、複雑なC宣言を解読できるようにするのに非常に役立ちます()。

于 2012-11-08T18:28:53.287 に答える
1

例:

#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;
} 
于 2012-11-08T18:35:29.800 に答える
0

最初の次元の各要素(各要素は配列へのポインター)に新しい配列を割り当てる必要があります。そのためにループを使用できます。

for(i = 0; i < NCOLS; i++)
   arr[i] = (double *)malloc(sizeof(double)*nrows);

解放するために同じことをしてください。

于 2012-11-08T18:28:53.397 に答える