2009/12/14

二重(ダブル)ポインタを久しぶりにつかってハマった

 
C++使って、動的に2次元の配列を確保しようとダブルポインタを久しぶりに
使ったのですが、2時間あまりハマってしまいました( ´д`)
 
やってしまった例を書くと、
 

 
//  2次元配列確保
char** array = (char**)(new char*)[10];

 
//  各配列の要素に1次元確保
a[0] = new char[10];
  


 
というミスです。
 
自分の認識間違いに気づくのにすっごい時間かかってしまいました。
 
 
ここを読んでいるCマニアのあなたは、
 
上記の間違いに気づきましたか?
 
 
 
昔はよく利用していたテクニック?だったのですが、久しぶりに使うとハマリ、そもそも言語
レベルで許されてる仕様なのか?とか、色々疑ってしまいます。
 
 


 
char** array = (char**)(new char*)[10];
                                             ↑ここがダメ
 (new char*) としてしまい、カッコの中が優先

され [10] という処理が無視されてしまう。

       ( char* を無理やり char** にキャストしてるだけ )



正しくはこうやる↓

char** array = new (char*[10]);
 
// char* 型の要素10個を持ったメモリ領域への先頭アドレスを  char**array に渡してやる。
 
 
 
ダブルポインタはややこしいので、いつも使うぐらいの気持ちで接してないと、
こんがらがってしまいますね( ´д`)
 
まぁいつも使わなければならないよう状況ってのは、まず無いですけどw
 
 
 

0 件のコメント:

コメントを投稿