web-dev-qa-db-ja.com

ヒープは2D配列を割り当てます(ポインターの配列ではありません)

私はCコードを書いていますが、512 * 256バイトをヒープ割り当てしたいと思います。私自身の便宜のために、構文array [a] [b]を使用して要素にアクセスできるようにしたいと思います。適切なインデックスを見つけるための算術演算はありません。

オンラインで見るすべてのチュートリアルでは、配列に必要な行の配列を指すポインターの配列を作成するように指示されています。これは、各サブアレイを個別にmallocおよびfreeする必要があることを意味します。 mallocへの呼び出しとfreeへの呼び出しを1回だけ必要とするソリューションに興味があります(したがって、すべての要素が連続しています)ギザギザの配列を作成しないため、これは可能だと思います。

誰かがそのような配列を宣言するための構文を共有できれば幸いです。

25
Paul

さて、型の配列を割り当てたい場合は、その型のポインタに割り当てます。

2D配列は配列の配列(この場合、256文字の512配列の配列)であるため、256文字の配列へのポインターに割り当てる必要があります。

char (*arr)[256]=malloc(512*256);
//Now, you can, for example:
arr[500][200]=75;

*arrを囲む括弧は、ポインターの配列ではなく、配列へのポインターにするためのものです)

39
asaelr

このように配列を割り当てる場合、freeへの2回の呼び出しが必要ですが、array[a][b]スタイルの構文であり、連続しています。

char **array = malloc(512 * sizeof(char *));
array[0] = malloc(512*256);
for (int i = 1; i < 512; i++)
    array[i] = array[0] + (256 * i);

見る array2詳細についてはこちら: http://c-faq.com/aryptr/dynmuldimary.html

14
Matt Eckert

これは、古いC89標準との互換性が必要ないことを前提とすると簡単です(現在のCコンパイラの中で、MSVCといくつかの組み込みターゲットコンパイラのみが逆になっています)。方法は次のとおりです。

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

その場合、array[a][b]は、[0,rows)aおよび[0,cols)bに対して有効です。

C標準の言語では、arrayには可変的に変更されたタイプがあります。他の関数へのポインターを渡したい場合は、関数の引数リストでこのタイプを繰り返し、少なくとも列の数が関数に渡されていることを確認する必要があります(可変的に変更された関数の一部として必要なため)タイプ)。

編集: OPが512x256の固定サイズしか気にしないという事実を見逃しました。その場合、C89で十分であり、必要なのは次のとおりです。

int (*array)[256] = malloc(512 * sizeof *array);

関数間でポインタを渡す必要がある場合は、関数の引数リストでまったく同じ型を使用できます(また、関数の戻り値の型としても使用できますが、この用途では、typedefを使用することをお勧めします... :-)

配列のサイズは事前にわかっているので、521x256配列を含むstruct型を作成してから、structを動的に割り当てることができます。

5
trutheality

配列のサイズがわかっている場合は、それをtypedefして、それへのポインターを作成できます。この使用法を示す短いスニペットを次に示します。

#include <stdio.h>
#include <stdlib.h>

typedef int array2d[20][20];

int main() {
    int i,j;
    array2d *a = malloc(sizeof(array2d));
    for(i=0;i!=20;i++)
        for(j=0;j!=20;j++)
            (*a)[i][j] = i + j;

    for(i=0;i!=20;i++)
        for(j=0;j!=20;j++)
            printf("%d ",(*a)[i][j]);
    free(a);
    return 0;
}
2
dasblinkenlight

is同じ種類の多次元配列を動的に割り当てることができます

static char x[512][256];

あなたに与えます、しかしそれは型崩壊のためにちょっとトリッキーです。私はtypedefでそれを行う方法しか知りません:

typedef char row[512];
row *x = malloc(sizeof(row) * 256);

これにより、実行時に2番目のディメンションのサイズを決定することしかできません。実行時に両方の次元が変化する可能性がある場合は、ドープベクトルが必要です。

2
zwol