• ベストアンサー

newとunsignedについて

初めまして. OS:windows XP ソフト:VisualStudio.net2003(C++) を使用してプログラミングをしています. (C++を始めて1ヶ月の初心者です) 動的配列を確保する上で,unsignedを使用する場合, unsigned short *Array = new unsigned short[size]; としているのですが,デバックをした際に妙な(ハングルなどの意味のない)文字列が配列ポインタの後についてしまいます. 心配になり, unsigned short *Array = (unsigned short *)new unsigned short[size]; としてみたのですが,それでもその文字列がポインタの後ろについてしまいます. これは問題がないのでしょうか? ご指摘願います. 追記:このあとで物理量から16bitバイナリーデータに変換する(D/A変換器の)関数でエラーがでており,このnewの使い方が怪しいと思ってます.

質問者が選んだベストアンサー

  • ベストアンサー
  • S117
  • ベストアンサー率40% (18/45)
回答No.4

デバッガがunsigned shortをwchar_tと見なしているのではないでしょうか。そのために、unsigned shortのポインタからワイド文字列を読み取って表示しているものと思われます。 デバッグ時の追跡を容易にするためにメモリを特定のパターンに初期化するので、プログラム上初期化されていない箇所を文字列として参照するとそういうことになります。 試しに手元のVC++2008 Express Editionを使ったら再現しました。 対策は別のデバッガを使うか、無視するの二択です。

llringoll
質問者

お礼

丁寧なご回答に,わざわざ再現までしていただきありがとうございます. wchar_tという型はわかりませんが,そういう仕様であると理解するしかないのですね. 現状,一応きちんとデータも取れて動作しているので,無視する方向で行きたいと思います. ありがとうございました!

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

#1 でいわれる通り (組み込み型では) new で確保しても初期化されないのですが, その表示が本当だとすると... う~ん, そのデバッガが腐ってるのかもしれない.... とりあえず, new で確保した後にすべて 0 でクリアするコードを入れてみてはどうでしょうか. これでも表示が変わらないとすると, デバッガが怪しいと頭に置きつつ進めるしかないかも. あと, その後 D/A 変換のところでエラーが出るというのはどのようなエラーが出るんでしょうか? 実行時にエラーが出るなら「初期化しないといけない」「size の値が実は不足している」くらいは想像できますが, そこはちょっとメッセージを見ないと分からないところです. おまけだけどキャストは不要.

llringoll
質問者

補足

丁寧なご回答ありがとうございます. デバッガですか…. ちょっと心当たりがあるので,焦っています. newやD/Aボードの使い方に慣れていない時期に, newで確保していないところにデータを書き込んでしまうようなプログラムを組んでしまったことがあり, ウィルスバスターに警告を発せられたことがあったのです. そのときは大丈夫だろうと無視してしまったのですが…. 一応,今もその他の部分についてはきちんと動いていることは確かです. (前述したようにunsignedを使用していない部分では変な表示が出ていません) D/A変換の関数というのが,D/A変換ボードのライブラリ関数ですので, 詳しい構造が分かりません.(スミマセン...) エラーの内容は, "ドライバ内部で作業する為のメモリの確保に失敗した" というものです. (ちなみに,D/AボードはInterface社のLPC-361216というものを使っています.)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

これだけでは問題があるともないともいえません. そのあとでどう使うかによります. なお, 「妙な(ハングルなどの意味のない)文字列が配列ポインタの後についてしまいます」といわれても, 「配列ポインタ」の意味もわからないければ「後」というのが何のことなのかわからないし, なぜここで「文字列」が出てくるのかもわからないです.

llringoll
質問者

補足

回答ありがとうございます. 説明不足で申し訳ありません. 配列ポインタというのは,配列の先頭のポインタのつもりでした. (Array[size]のArrayのこと) 「文字列」の意味は, unsigned short *Array1 = (unsigned short *)new unsigned short[size]; double *Array2 = (double *)new double short[size]; のあとにブレークポイントを設け,デバックの変数ウィンドウを見てみると, 名前  値 Array1 0x009b79b8"헥헥헥헥헥헥・・・" Array2 0x009b7a58 と出てくることです. 独学で虫食い状態でプログラミングをしているため,まだまだ説明不足かもしれませんので,ご指摘お願いいたします.

  • takoashi
  • ベストアンサー率39% (21/53)
回答No.1

newで確保した領域は、初期化されていません。

llringoll
質問者

お礼

回答ありがとうございます. unsigned short *Array = (unsigned short *)new unsigned short[size]; のあとで, Array[0] = (Data[0] + Data[1] + Data[2]); としても,デバックの変数ウィンドウに Array 0x009b79b8"헥헥헥헥헥헥・・・" といった文字が出てきます. 他のunsignedを使っていない配列にはそういったものがでてこないのですが…

関連するQ&A

専門家に質問してみよう