C++ 二次元配列の動的生成について
掲題の件、以下のステートメントが紹介されているサイトをよく見かける。
--------------------------------------------------------------------
// 動的生成(smax * slen)
char **s = new char*[smax]
for(int i = 0;i < smax;i++) s[i] = new char[slen];
// 上記ステートメントで動的に生成したメモリ領域の開放
for(int i = 0;i < smax;i++) delete s[i];
delete s;
--------------------------------------------------------------------
しかし、上記ステートメントだと、配列sは厳密には「2次元配列」((smax * slen)個分)としてではなく、
「ポインタの配列」((1次元配列(slen個分)の先頭要素のポインタ)の配列)として作成される。
【根拠】
以下のソースでコンパイル時にエラー「no matching function for call to 【関数名】」となる。
--------------------------------------------------------------------
const int smax = 3;
const int slen = 7;
void print(char x[slen], int n)
{
cout << x[n] << endl;
}
void strcopy(char dst[slen], char src[slen], int i)
{
/* srcの文字列をdstにコピーする */
]
int main()
{
char p[slen] = { ‘First’,’Second’,’Third’ };
// 配列を動的生成
char **s = new char*[smax]
for(int i = 0;i < smax;i++) s[i] = new char[slen];
// 配列に値をコピーする
for(i = 0;i < max;i++) strcopy(s, p, i)
// 配列の中身を画面表示
for(i = 0;i < smax; i++) print(s, i);
// 動的に生成したメモリ領域の開放
for(int i = 0;i < smax;i++) delete s[i];
delete s;
return 0;
}
--------------------------------------------------------------------
2次元配列を仮引数としている関数strcopy()に、動的に生成した配列sが受け渡しが行えないというエラー。
※ 尚、同じ2次元配列pについては、コンパイルでエラーとなっていない。
配列sは2次元配列として作成したつもりだったのだが、
「2次元配列として受け渡しが行えない。」となると、
論理上、配列sは「2次元配列として作成されていない」ように思う。
以下のように動的生成すればOK。
--------------------------------------------------------------------
// 要素がslen個分ある配列を、smax個分動的生成。(smax * slen)
char (*s)[slen]= new char[smax][slen]
// メモリの開放
delete s;
--------------------------------------------------------------------
以下のソースでコンパイルしたところ、正常終了した。
--------------------------------------------------------------------
const int smax = 3;
const int slen = 7;
void print(char x[slen], int n)
{
cout << x[n] << endl;
}
void strcopy(char dst[slen], char src[slen], int i)
{
// srcの文字列をdstにコピーする
]
int main()
{
char p[slen] = { ‘First’,’Second’,’Third’ };
// 配列を動的生成
char (*s)[slen]= new char[smax][slen];
// 配列に値をコピーする
for(i = 0;i < smax; i++) strcopy(s, p, i);
// 配列の中身を画面表示
for(i = 0;i < smax; i++) print(s, i);
// 動的に生成したメモリ領域の開放
delete s;
return 0;
}
--------------------------------------------------------------------
<動作環境>
以上。