1

次のように C で 2D 配列を作成します。

int **arr;
arr = malloc(rows * sizeof(int *));

for (i = 0; i < rows; i++)
    arr[i] = malloc(cols * sizeof(int));

今、私は電話します:

func(arr)

関数funcで、行と列の次元を計算するにはどうすればよいですか?

4

5 に答える 5

8

あなたはそれを計算することはできません -arrポインタへの単なるポインタであり、それに関連する情報はありません (すべての C 配列と同様)。ディメンションを個別の引数として渡す必要があります。

于 2010-03-09T18:43:12.160 に答える
3

できません。配列とともに次元を関数に渡す必要がありますfunc(arr)

于 2010-03-09T18:43:39.523 に答える
2

できません (C の美しさ)。(sizeof を使用しようとしないでください。ポインタのサイズしか得られないためです) 別の関数が配列の次元を知る必要がある場合は、それらのパラメータ (高さと幅) を引数として渡す必要があります。配列ポインタで。

于 2010-03-09T18:43:50.497 に答える
0

この回避策は、配列を直接使用せず、代わりに次のような構造体を使用することです。

構造体テーブル{
    int ** arr;
    int行;
    int列;
}

次に、行と列の数を受け取り、割り当てを処理するテーブルのインスタンスを作成する関数を作成できます。

于 2010-03-09T19:02:16.043 に答える
0

他の皆さんがおっしゃる通り、仕方ありません。ただし、行、列、およびポインターをまとめて含む構造を作成すると便利な場合があります。これにより、次のことが言えます。

typedef struct { int 行; int列; int **データ; } myDataType;

... foo(マイデータ);

void foo(myDataType myData) { for( i = 0; i < myData.rows; i++) {
for( j = 0; j < myData.cols; j++ ) { printf("%d,%d: %d\n ", i, j, myData.data[i][j]); } } }

(構文が少しずれていたら申し訳ありません。Perl、Java、C#、そしてちょっとした Ruby がエルボー スペースを取り合っています。)

于 2010-03-09T19:05:41.277 に答える