C++での多次元配列の作り方
今日久しぶりにC++やってnew char[x][y]って書いたらコンパイラに怒られたのでメモ。
1:コンパイル前に大きさが決まってる場合。
char str[5][5];
int x = 5; int y = 5; char **str; str = new char*[x]; for(int i = 0; i < x; ++i){ str[i] = new char[y]; }
1はstr[0][0]からstr[n][n]まで領域が連続的に連なっている。
2はstr[n][0]からstr[n][n]までは領域が連続的に連なっている。str[n][n]とstr[n+1][n]までの間に領域の連続性は無い。
あとなんか、
int y = 5; char (*str)[5]; str = new char[y][5];
こんなやり方もあるらしいけど、具体的に何やってんのか謎。
2008-10-11 : delete時の注意を書き忘れてたので追記。
1はスタックに入るからスコープ抜ければ勝手に消えるけど、2はnewを何回もやってるから破棄が面倒。
具体的には2の例で作った配列の場合、
for(int i = 0; i < x; ++i){ delete [] str[i]; } delete [] str;
とする必要がある。
作ったのと逆順でdeleteするだけだけど、いきなり delete [] str して破棄したつもりにならないように注意。