• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:設定した値が意図せぬ値に)

設定した値が意図せぬ値に - 調査結果

このQ&Aのポイント
  • 入力された値を使用して計算を行うプログラムで、設定した値が意図せぬ結果になっている問題
  • プログラムのバグにより、最終的な結果が正しく計算されず、意図した値とは異なる結果が出力される
  • バグの原因は不明であり、修正方法を見つけるために他のプログラマーの助けが必要

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

  • ベストアンサー
回答No.3

>int line[n-1][MAX]; >int num[n-1][MAX]; こうすると、使える要素は、line[0][0]~line[n-2][99]の範囲だけど、判ってる? nに4を代入すると使える要素は、line[0][0]~line[2][99]の範囲だけど、判ってる? たぶん、このままだと、num[n-1][]にアクセスするとline[0][]のメモリをアクセスすると思う。 int line[10][100]; int num[10][100]; って状態で、num[10][]に書き込むと、line[0][]があるメモリにアクセスする。 メモリの物理配置が以下のようになっていると想定してみよう。 num[0][] num[1][] num[2][] num[3][] num[4][] num[5][] num[6][] num[7][] num[8][] num[9][] line[0][] ← ここはnum[10][]と同じアドレス line[1][] ← ここはnum[11][]と同じアドレス line[2][] ← ここはnum[12][]と同じアドレス line[3][] ← ここはnum[13][]と同じアドレス line[4][] ← ここは(以下略) line[5][] line[6][] line[7][] line[8][] line[9][] 「配列の要素を何個確保したのか」を良く考えなさい。

guhan
質問者

お礼

>>int line[n-1][MAX]; >>int num[n-1][MAX]; >こうすると、使える要素は、line[0][0]~line[n-2][99]の範囲だけど、判ってる? 初心者でこういう初歩的なこともわかっていませんでした。 本当に教えてくださってありがとうございます。 後半のメモリについてご教授してくださったことも教科書も教科書を読んだ限りでは曖昧だったのですごい助けになりました。

その他の回答 (4)

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

C++98/C++11 の規格に従う限り (どちらも「定数式」とあるので) だめなはずです>#4. GCC では標準で通していると思いますが, -pedantic オプションをつけて g++ -pedantic -ansi -std=c++98 これ とかやると警告が出ます. なお, MSC ではきっちりエラーにしてくれます. C99 や C11 なら OK なんだけど.... あと, 「n がでかい状況」もやばいっちゃやばいですが, それよりもこんなところで 0 や 1 のチェックをしちゃいかんでしょう.

guhan
質問者

お礼

環境によればエラーが出るようなことなんですね

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.4

>int line[n-1][MAX]; って. 規格的にはアウトじゃないかなぁ (n が定数じゃない). C++なら…OKでしたかね? >#include <iostream> なのでC++かと思われますが。 ちなみに、 c++ (GCC) 4.4.6 20110731 (Red Hat 4.4.6-3) ではビルドは通りました。(CentOS6.2の標準パッケージ) 結果は異なりましたけどね。 出力 3 14 でした。(まぁ、どのみち正常動作は期待できないので結果がどうなろうがアレですが。) >よしんば OK だとしても, この後で n のチェックするようじゃだめ. スタックオーバーフローかコアダンプか……。 100000000で「セグメンテーション違反です (コアダンプ)」でした。

guhan
質問者

お礼

指摘ありがとうございます

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

本題は終わってるような気がするんだけどちょっと気になったので: int line[n-1][MAX]; って. 規格的にはアウトじゃないかなぁ (n が定数じゃない). よしんば OK だとしても, この後で n のチェックするようじゃだめ.

guhan
質問者

お礼

ご指摘ありがとうございます

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.1

単純にバッファオーバーランしているだけではありませんか? >cin >> n; でnに4が入ると、 >int line[n-1][MAX]; >int num[n-1][MAX]; は int line[3][MAX]; int num[3][MAX]; になります。 で… >num[n-1][k]= line [n-1][k]; ここでバッファオーバーランしています。 num[3][k]はありませんから。 num[0][0]~num[0][99]、num[1][0]~num[1][99]、num[2][0]~num[2][99]まででnum[3][]は無い。 ということは理解されてます? # line[n-1][k]も同様です。

guhan
質問者

お礼

バッファーオーバーランっていうんですね ありがとうございます

関連するQ&A

専門家に質問してみよう