あなたのこの宣言は動作しません:
int *array[][]; // this is a pointer to a 2-dimensional array??
まず、int *
の2次元配列を宣言しようとしています。第2に、配列を宣言または定義するときは、最初の次元以外のすべての次元を指定(サイズ指定)する必要があります。
int (*array)[][2]; // This is a pointer to a 2D array of unknown size
これは、機能の主要な変種で使用できるようになりました。私はあなたの質問を最初に誤解していたので、それは変種です。
void load(void)
{
...
int tempArray[n][2]; // Note the reversed order of dimensions!
...
array = &tempArray;
...there must be some code here calling functions that use array...
array = 0;
}
割り当てには、アレイ名に&
が必要であることに注意してください。他の機能では、次のように記述する必要があると思います。あまりにも
n = (*array)[i][j];
注意を、グローバル変数にローカル配列のアドレスを割り当てることは危険であること。ファンクションload()
が返されると、tempArray
の記憶領域は無効になります。したがって、代入を行う唯一の安全な方法は、グローバル変数を参照する関数を呼び出してから、関数を終了する前にグローバルをリセットすることです。 (または、少なくとも値が無効であることを認識しますが、ヌルポインタを0に設定すると、ランダムメモリにアクセスするのではなく、プログラムがクラッシュする可能性がより低くなります。
また、配列の動的メモリ割り当て。
あなたの質問は、実際の変数の次元が最初ではないVLA、可変長配列へのグローバルポインタを作りたいと思っている
:
int tempArray[2][n]; // Note the reversed order of dimensions!
あなたは、単にこのようにグローバルポインタを作成することはできません配列。
ので、複数の問題があります:あなたは、マルチするグローバルポインタを持つことはできません
は、ローカル変数へのグローバルポインタを割り当てる配列へのポインタを初期化
を配列へのポインタのための
- 表記可変長さが第1の次元にない次元VLA。
- グローバルの使用を最小限に抑える必要があります。