impedance(インピーダンス) 全てに抗え!!

この世の全てに歯向かい、抵抗することでしか存在を見いだせない愚直な漢のオルタナティブ? ブログ

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;

}

--------------------------------------------------------------------

 

<動作環境>

MacOS 10.2.3、Xcode 8.2.1

Darwin 16.4.0、gcc 9.2.1

 

以上。