過去の投稿記事 new!
・【画像】漫画でわかる外国人参政権
・東京電力のHPで停電状態が確認できたり(サービス再開!)
・戦国時代 ~ 江戸時代の徳川家康が熱かった
・vaio のバッテリは寿命が短いような気がする
・話題の Western Digital 製 WD20EARS を購入した
・C01LC をビックカメラで買ってきた
・2025年には空中都市が現実化?!
・【動画】わかりやすい「宇宙ひも理論」
・今世紀には「富士山噴火」「東海連動地震」「首都圏直下型地震」か?
・滅びた町、南浜町が Googleストリートビューで見れる

【 amazon 送料無料キャンペーン 】

バックリンクはご自由にどうぞ!     http://mfsocket.blogspot.com/feeds/posts/default?alt=rss リンク集 / ログイン

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 コメント:

  • コメントには <b>, <strong>, <em>, <i>, <a> など一部の HTML タグを使用できます。