多次元配列
捨てコードだと、画像の画素値を格納した変数として、
int I[2000][1000] = { {0} };
なんてやっちゃうよね。んで、サイズが大きいとメモリがスタックに確保できないで、セグフォが出ちゃう。
しょうがないから、初心に帰って、
int* I = new int[2000*1000];
とかすると思うんだけど、こうすると、
I[x][y] = 100; // NG! => should be I[x*1000+y]
みたいなアクセスができなくて、コードが美しくない。
こんな時は、
int (*I)[1000] = reinterpret_cast<int(*)[1000]>(new int[2000*1000]);
って宣言すれば、ばっちりだ! I[x][y]
でアクセス可能!
結論
よい子は、
vector< vector<int> > I(2000, vector<int>(1000));
ってやればいいと思うよ。
注意
現在の C++ の規格では、配列のサイズを変数で (たとえ const がついていても) 指定できないから注意*1。唯一できるのは、最後の vector
だけ。とはいえ、 GCC とか、モダンコンパイラなら独自拡張で指定可能。そんな時は、 -ansi
とか -pedantic
とかつけて、エラーになっちゃえばいいよ。
参考
にあるように、サイズが定数なら new T[n][m]
とできる。この時、変数は delete[]
で消していいらしいが、仕様上はどうなってるかは不明。
*1:const 変数なら可能。 C だと不可