[解決済み】多次元配列はメモリ上でどのようにフォーマットされるのですか?
質問
C言語では、次のコードを使用して、ヒープ上に2次元配列を動的に割り当てることができますね。
int** someNumbers = malloc(arrayRows*sizeof(int*));
for (i = 0; i < arrayRows; i++) {
someNumbers[i] = malloc(arrayColumns*sizeof(int));
}
明らかに、これは実際に整数の束の別々の一次元配列へのポインタの一次元配列を作成し、"The System"は私が求めるときに何を意味するかを把握することができます。
someNumbers[4][2];
しかし、次の行のように2次元配列を静的に宣言すると......。
int someNumbers[ARRAY_ROWS][ARRAY_COLUMNS];
...同様の構造がスタック上に作成されるのでしょうか、それとも完全に別の形式なのでしょうか?(すなわち、それはポインタの1次元配列ですか?そうでない場合、それは何ですか、そして、それへの参照はどのように把握されますか?)
また、私が「システム」と言った場合、実際にそれを把握するのは何なのでしょうか?カーネルですか?それとも、Cコンパイラがコンパイル時に整理しているのでしょうか?
解決方法は?
静的2次元配列は、配列の配列のように見えますが、メモリ上に連続的に配置されています。 配列とポインタは同じものではありませんが、同じように使えることが多いので、時々混乱することがあります。 しかし、コンパイラは適切に追跡し、すべてをうまく並べてくれます。 静的な2次元配列には注意が必要です。
int **
というパラメータがあると、まずいことになります。 以下に簡単な例を示します。
int array1[3][2] = {{0, 1}, {2, 3}, {4, 5}};
メモリ内では以下のようになります。
0 1 2 3 4 5
まさに と同じです。
int array2[6] = { 0, 1, 2, 3, 4, 5 };
しかし、もし
array1
をこの関数に渡してください。
void function1(int **a);
を実行すると、警告が表示されます (そして、アプリは配列への正しいアクセスに失敗します)。
warning: passing argument 1 of ‘function1’ from incompatible pointer type
2次元配列は
int **
. 配列からポインタへの自動的な分解は、いわば一段深いところからしか行われないのです。 というように関数を宣言する必要があります。
void function2(int a[][2]);
または
void function2(int a[3][2]);
すべてを幸せにするために。
この同じコンセプトは、次のように拡張されます。 n -次元の配列です。 しかし、このようなおかしなことを利用すると、かえって分かりにくくなるのが一般的です。 だから、気をつけてね。
関連
-
[解決済み】GCC Cコードで静的宣言が非静的宣言に続くことを解決するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 多次元配列の値によるソート方法
-
[解決済み] JavaScriptで配列を比較する方法は?
-
[解決済み] JavaScriptで2次元の配列を作成するにはどうすればよいですか?
-
[解決済み] JavaScriptで2つの配列の差を取得する方法は?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み] C++で配列はどのように使うのですか?
-
[解決済み】JavaScriptで2つの配列を結合し、項目の重複を排除する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み】「ポインタから異なるサイズの整数へのキャスト」エラーが発生するのはなぜですか?
-
[解決済み] c - 初期化がキャストなしでポインタから整数を作る、さらに2つのコンパイラーエラー
-
[解決済み】単項演算子「*」の型が無効(「int」がある)C言語でのエラー
-
[解決済み] clang: error: linker command failed with exit code 1が表示されるのはなぜですか?
-
[解決済み】C言語で浮動小数点例外(コアダンプ)発生
-
[解決済み】ヒープ割り当てで初期化されていない値が作成された
-
[解決済み】EAGAINとはどういう意味ですか?
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み】宣言指定子で2つ以上のデータ型がある場合のエラー【非公開