26

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

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

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

4

7 に答える 7

42

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

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

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

(かっこで囲まれ*arrているのは、ポインターの配列ではなく、配列へのポインターにするためです)

于 2012-04-12T02:37:11.603 に答える
14

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

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

thenは、 inおよびinarray[a][b]のいずれかに対して有効です。a[0,rows)b[0,cols)

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

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

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

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

于 2012-04-12T02:39:40.770 に答える
14

このように配列を割り当てると、 を 2 回呼び出す必要がありますが、スタイル構文freeが許可され、連続しています。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

于 2012-04-12T01:51:22.563 に答える
5

配列のサイズが事前にわかっているのでstruct、521x256 配列を含む型を作成し、struct.

于 2012-04-12T01:56:55.623 に答える
4

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

static char x[512][256];

が得られますが、型の崩壊のために少し注意が必要です。私はそれを行う方法しか知りませんtypedef:

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

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

于 2012-04-12T02:01:23.510 に答える
2

配列のサイズがわかっている場合は、配列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;
}
于 2012-04-12T02:00:43.630 に答える
0

すべての素晴らしい答え。古いマシンで、Turbo C のような古いコンパイラを使用して 16 ビットの「レトロ」なコーディングを楽しんでいる私のような古い変人のために、1 つ付け加えておきたいことがあります。可変長配列は素晴らしいですが、必須ではありません。

    char (*array)[81];
    int lineCount;

    /* Go get your lineCount.*/
    lineCount = GetFileLines("text.fil");

    array = malloc(lineCount * 81);

これが昔の「VLA」のやり方です。それはまったく同じように動作します

    char (*array)[81] = malloc(lineCount * 81);  /* error pre C99 */

VLAの贅沢なしで。

私の古くて変色した2セントだけです。

于 2021-04-13T03:15:33.173 に答える