機能としては、
test(array)
次に関数プロトタイプはarr
「はchar
へのポインタのM要素の配列へのポインタ」型を持つ、いずれの場合のいずれか
void test(char *(*arr)[M])
又は
void test(char *arr[][M])
する必要があります。これはchar ***
と同じタイプではなく、2つの間で変換するための実際には良い方法もクリーンな方法もありません。
char ***array = malloc(sizeof *array * N);
if (array)
{
size_t i;
for (i = 0; i < N; i++)
{
array[i] = malloc(sizeof *array[i] * M);
if (array[i])
{
size_t j;
for (j = 0; j < M; j++)
{
array[i][j] = some_initial_pointer_value();
}
}
}
}
(注)この場合には、array
の種類がchar ***
であること:
あなたはdynamcallyその後、プロトタイプが正しいだろう、次のようにarray
を割り当てられて割り当てられていました。
T a[M][N]
と宣言されている配列で作業していて、サイズの異なる配列を受け入れる関数を作成する場合は、Jensの示唆に基づくVLA構文を使用するか、 :
void test(char **a, size_t rows, size_t cols)
{
size_t i, j;
...
some_pointer_value = a[i * rows + j];
...
a[i * rows + j] = some_pointer_value;
}
...
test(&array[0][0], 50, 50);
この場合、配列の最初の要素のアドレスと配列の次元を別々のパラメータとして明示的に渡します。 test
の体内では、配列を1次元(char *a[rows * cols]
)として扱い、手動でオフセットを計算します。これは、連続して割り当てられた配列に対してのみ機能することに注意してください。これは、上記の配列の各行に対して断片的な割り当てを行うバージョンでは機能しません。
ポインタの配列を割り当てる必要があります。しかし、 'test'を再設計することを検討してください。トリプルポインターは、コード臭のビットです。 –