###mallocで領域確保した際、実際メモリ上ではどのような状態になっているのか曖昧です
typedef struct box { int num; struct box*array[5]; }BOX; BOX*data = (BOX*)malloc(sizeof(BOX)); for(int i = 0; i<5; ++i) { data->array[ i ] = (BOX*)malloc(sizeof(BOX)*3); }
この時、
data->array[n][m](n = 0〜4, m = 0〜2)
のように2次元配列の座標として扱えるのか、もしくは
data->array[n]->array[m](n=0〜4、m=0〜2)
のように、ポインタのポインタとして扱えるのかどうか....
###試してみたこと
BOX value; BOX*pointer; //↑の2つを用意して、 data->array[n][m] = value; //① data->array[n]->array[m] = pointer; //② //(n,mはそれぞれ0〜4、0〜2までの任意の数字) //このように2つの場合を想定して、①には値を、②にはポインタを代入してみた
上記の①と②を実行すると、何のエラーもなく正常に動きました。
ただ、それだとdata->arrayは①,②の両方を実現できてしまっているという事になります。
しかし実際のところ、どちらか一方が正しく、もう一方は間違った認識だと思うのですが、どうなのでしょうか(^_^*)
[ポインタ虎の巻 多次元配列の実現](http://www.nurs.or.jp/~sug/soft/tora/tora10.htm )
こんなのを読まれてみては如何でしょうか。
>上記の①と②を実行すると、何のエラーもなく正常に動きました。
それで、そのコードによって具体的にどの様な結果になると予想され、実際にどの様になったのでしょうか。
先述のサイトを拝見させて頂きました。
「配列へのポインタ」と
「ポインタへの配列」とでは、意味が異なるんですね。(°_°)
初知りです(驚)
> それで、そのコードによって具体的にどの様な結果になると予想され、実際にどの様になったのでしょうか。
個人的には①が正しいと思っており、②のような
data->array[n]->array[m]
という、ポインタ先のポインタの領域は存在していない(確保していない)ため、②に関してエラーメッセージがあると予想してました。
予想と異なり、どう動作したのでしょう。
各変数の値を全て表示するようにして、1 をした場合と 2 をした場合でそれぞれどうなってどう違ったのかを確認する等はしていないのでしょうか。
予想して結果が違ったとそこで手を止めるのではなく、なぜ違うのか、コードとしてどの部分が予想と違う為に結果が違うのかを追ってみては如何でしょう。
想像・予想し、実験・確認して、コード(あるいは考え方、または両方)を直す。
これは単に勉強のためだけでなく、実際に動作するプログラムを作る際のデバッグの作業と同じです。
ご指摘ありがとうございます。
当問題については無事、解決致しましたm(__)m
ちなみに、僕が実際に確認した方法としては、mallocでメモリ領域を確保した場合、同じ行番号の列要素のアドレス値は連続的になっているはずなので、①,②どちらかが正しくない認識であれば、正しくない方のアドレス値は連続的になっていないと考え、実際にアドレス値を出力し、比較してみました。
結果は、どちらも行インデックス別の列要素が連続的にメモリ確保されていたので、①,②は共に存在している領域であったことに至りました。
解決おめでとうございます。
>僕が実際に確認した方法としては、~
そのコードと結果、並びに考察をご質問に書いて頂けると、例えば注目すべき変数・表示の仕方、その読み方が違うなどを確認出来ます。
上で「具体的に」と書きましたのはその意味ででした。
回答1件
あなたの回答
tips
プレビュー
