- ベストアンサー
配列の初期化で値が代入されない原因とは?
- 配列の初期化に問題があります。
- 配列を初期化する際に、要素数を指定せずに初期化している可能性があります。
- また、初期化する値に誤りがあるかもしれません。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
見たところおかしいところはありません。 一応、念のためですが、 x,y ともに intですね? int point_y[20] = { 0 }; は、point_y[0] のみ初期化する意図ですね?0~19すべて初期化するのであれば、 {0,0,0, … } と0を20個書いてください。 ところで、”この時点”というのがどの時点か分かりませんが、恐らくなんらかのデバッガだと思いますが、 ステップ実行で見るなら、 c=c+1; まで実行させてから変数の内容を確認してみてください。 もっと確実なのは、printf()文を入れて出力させる方法です。
その他の回答 (8)
- uyama33
- ベストアンサー率30% (137/450)
NO6 です。 失礼しました。 原因は、リリースモードでビルドしたものを デバッグしていたからでした。 デバッグモードでビルドしたものを デバッグしたら、きれいに表示されました。 間違った情報で、混乱させました。 ごめんなさい。
お礼
いえ、2回もコメントを書いてくださってありがとうございました。 リリースモード、デバックモード、意識します。 今回はデバックモードです。
- titokani
- ベストアンサー率19% (341/1726)
VC++の場合ですが、releaseモードの場合、変な値が表示されることはあったと思います。 いずれにせよ、printfで正しく表示されるのであれば、実行結果としては正しいわけで、問題ではありません。 なぜこうなるのか、ということがどうしても気になるのであれば、アセンブリ出力を追ってみるとわかるのではないかと思います。
お礼
なるほど、VC++のreleaseモードで発生するのですね。 環境はそれかもしれません。 printfでの結果ありきで安心してよさそうで、ホッとしました。 ありがとうございました!
- Wr5
- ベストアンサー率53% (2173/4061)
既に指摘されていいますが… 「この時点」というのはどこまで実行した状態です? 少なくとも、 c = 0; が実行されていない状態で point_y[c]やpoint_x[c]を参照した場合、内容は保証されませんよ? cに入っている値が-78とかなら、 point_y[c]はpoint_y[-78]を参照しますし、 point_x[c]はpoint_x[-78]を参照します。 で、環境って結局なんなんでしょう??? >以下のようなコードを書いて、 >デバッガーで >b64out >をチェックすると、先頭部分が >フフフ。。。 >となっていて、変換に失敗しているのかなと思いましたが、 どの時点で確認したのでしょう? VSでデバッグ構成でビルドすると未初期化のローカル変数は0xCC(デバッガで見ると半角のフに見える)で埋められていたかと記憶していますが。 https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c904.html の「(4) /RTCs [Visual Studio 2005, Windows]」にもちょこっと書かれていますけど。 掲示されたコードだとおそらく base64_encode(p, (p+num), (char *)b64out); から戻って来るまでは値は不定(未初期化:デバッグ構成だと0xCCで埋まっていますし、リリース構成だと本当の意味で不定)になっているかと思われますが…。 VSのデバッグで(ウォッチの)値が変になる…という現象に出くわしたことはないですね。 # 自分が組み込んだ不具合以外では。 現状、仕事で使用しているHEWの方がブレークポイントで止めた時に表示される値がおかしい…ということはありますが。 スコープ内のハズなのにそんな変数は無い。とか言われたり。 # たぶん使い方とかの問題だと思いますけど…(最適化掛かっていたりするのもあるやも知れん)
お礼
該当行まで実行したあとの状態です。 「スコープ」と言うのですね。 最適化?とはなにか。。。というレベルですので、到底そういった凝ったことはできていません。 このようなことは今までなかったので(整数が入るはずの変数にカーソルを当てると妙な桁数の数字が表示される)あえて質問投稿しました。 やはり不思議現象なのですね。 コメントありがとうございました。
- uyama33
- ベストアンサー率30% (137/450)
私は、とても優れたコンパイラ VS2005 を使っています。 (高いお金を払って買ったものです。) 以下のようなコードを書いて、 デバッガーで b64out をチェックすると、先頭部分が フフフ。。。 となっていて、変換に失敗しているのかなと思いましたが、 さらに、このデータを使って次の操作をすると、 正確に変換されていたことが確認できました。 もしかしたら、MSのコンパイラを使っていませんか? そうなら、あきらめましょう。 MSには勝てませんから。 int num, i; char b64out[512]; char plain[256]; sprintf_s(plain, sizeof(plain), "%s\t%s\t%s", oc_Sender, oc_Sender, oc_POP3password); num = (int)strlen(plain); char* p = plain; for (i = 0; i<num; i++) if (p[i] == _T('\t')) p[i] = 0; base64_encode(p, (p+num), (char *)b64out); でも、最近は無料になったから、許してやることにします。
- na-_-mi
- ベストアンサー率0% (0/1)
> printfで出力したところ、正常に値が入っていることを確認できました。 > ただ、デバックしてカーソルを当てるとやはり8桁や10桁の乱数?が入っているので ということなら、デバッガーの使い方を間違えていませんか? ちゃんと目的の位置 > point_y[c] = y; > point_x[c] = x; > c = c + 1; まで実行した*後*に中身を見ていますか? それから、intの配列を0で初期化するのは、C言語では > int point_y[20] = { 0 }; > int point_x[20] = { 0 }; で全く問題ありません。 C++言語なら int point_y[20] = {}; int point_x[20] = {}; でも良いです。
お礼
その行まで実行したあとに確認して、の状態で困ってこちらに投稿しました。 なぜなのか、、、printfするとカーソルを当てたときと違い正常に値が入っている ことがわかったのですが。 気になります。 アドバイスありがとうございました。
Tacosanさんの言うとおり、int point_y[20] = { 0 }; で全て 0 で初期化されるはず。わざわざ 0 を20個並べる必要はありません。
お礼
ありがとうございました。 そのようにして初期化します。
- Tacosan
- ベストアンサー率23% (3656/15482)
ああ, #2 は自分で矛盾したこと書いてるな. int point_y[20] = { 0 }; で point_y の全要素を 0 で初期化してるから, ここを通っていればどの要素も 0 じゃないとおかしい. ということで, あとはあなたがどのような操作をしたかによる. つまり 「point_y[c]にカーソルを当てて中身を見る」 までの具体的な操作を全部書いてもらわないとどうにもならない. 書いてもらったらどうにかなるかといわれると, それは困るところだ.
- Tacosan
- ベストアンサー率23% (3656/15482)
とりあえず point_y[1] がおかしいのは「おかしいのが当然」だな. それ以上は具体的な情報がないとどうにもならん. 例えば, 最低限 ・実際に実行できる完全なプログラム ・動かした環境 がないと答えようがない. ちなみにだが, 配列の初期化では「不足する要素は 0 で初期化」なので int point_y[20] = { 0 }; は「point_y の全ての要素を 0 にする」という効果を持つぞ>#1.
お礼
いろいろと情報不足な質問で申し訳ありません。 配列初期化の方法、勉強になりました。 ありがとうございました。
お礼
ありがとうございました。 配列を20個ぶんゼロで初期化し、 printfで出力したところ、正常に値が入っていることを確認できました。 ただ、デバックしてカーソルを当てるとやはり8桁や10桁の乱数?が入っているので とても不思議です。