-3

2D 配列を割り当てるための関数を定義する必要がありますが、malloc は 1 回だけ呼び出す必要があります。

私はそれを割り当てる方法を知っています(-std = c99):

int (*p)[cols] = malloc (sizeof(*p) * rows);

しかし、関数からそれを返す方法がわかりません。関数が終了すると (または少なくともその一部が終了すると) 配列が存在しなくなるため、戻り値はオプションではありません。したがって、この関数に配列を渡すオプションのみがパラメーターとしてですが、上記のソリューションでは、宣言で列数を定義する必要があります。それは可能ですか?

ありがとう。

ユーザー kotlomoy のおかげで、この問題を次のように解決できました。

...
#define COLS 10
#define ROWS 5

int (*Alloc2D())[COLS]
{
    int (*p)[COLS] = malloc(sizeof(*p) * ROWS);
    return p;
}

//and this is example how to use it, its not elegant,
//but i was just learning what is possible with C

int main(int argc, char **argv)
{
    int (*p)[COLS] = Alloc2D();
    for (int i = 0; i < ROWS; i++)
        for(int j = 0; j < COLS; j++)
            p[i][j] = j;

    for (int i = 0; i < ROWS; i++){
        for(int j = 0; j < COLS; j++)
            printf("%d", p[i][j]);
        printf("\n");
    }

    return 0;
}
4

1 に答える 1

0
int * Alloc2D(int rows, int cols)
{
    return malloc(sizeof(int) * rows * cols);
} 

使用法。

割り当てるには:

int * array = Alloc2D( rows, cols );

要素 [i,j] を取得するには:

array[ cols * i + j ]

そして、メモリをきれいにすることを忘れないでください:

free( array );
于 2013-05-29T20:27:00.420 に答える