- ベストアンサー
C++で平均価格算出のエラー
- C++で平均価格算出のプログラムにおいて、特定の行でエラーが発生します。
- VC++でビルドしたところ、シンタックスは通りましたが、論理的なエラーが発生します。
- その行が通るためにはどうすれば良いでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
突っ込みどころ満載というか、何でも自分でやろうとしすぎているというか、……。 とりあえず提示のコードの範囲では、 char filename[20]; char buf[30], buf2[150]; char num[10], *n, *temp; n = _itoa(i,&num[0],10); if(i<10){ // count+=1; // 数字1桁 n[count]='\0'; }else{ count+=2; // 数字2桁 n[count]='\0'; } // ファイル名を作成 temp = strcat("Result", reinterpret_cast<const char *>(n)); は char filename[20]; char buf[30], buf2[150]; // 文中に出てこないけど、たぶんこの後の処理に使うのだろうから残す // ファイル名を作成 sprintf(filename, "Result%d", i); で十分なはずです。 あと、 > for(int i=0; i<=0; i++){ // XMLファイルが16ページある はコメントと処理内容があっていないと思うのですが……。
その他の回答 (2)
- mitoneko
- ベストアンサー率58% (469/798)
アクセス違反が出てくれて良かったですね。 典型的なCにおけるバッファオーバーフローのパターンです。これでも、エラーが出ないことが往々にしてありまして、その時には、セキュリティーホールの非常に良質なネタとなります。 まず、最初に、一つ、本質とは関係の無いアドバイス。 「reinterpret_cast」は、禁句だと思っておいた方が良いです。文法違反だと思っておいてもかまいません。 何故、こんなことを言われるかが、自分で理解できるまでは、そういうものだと思い込んでおいて良いでしょう。 之を使わないと解けないと思った時には、きっとあなたの考え方が間違っています。 このcastを本当に使わなければならない場面になった頃には、何故そうなのかも理解できているはずです。 さて、本題。 Cにおいては、メモリーの管理は、純粋に自己責任です。どんなポインターでも、型さえそろえたふりをすれば、渡せますし、書き込みだって簡単にできます。 これが、あだとなって、今回のようなプログラムが登場します。 strcatは、第一引数の指すアドレスに、第一引数の指す文字列と第2引数の指す文字列を合わせた物を書き込みます。 当然の前提として、第一引数の指すアドレスは、書き込み可能で、しかも、二つの文字列を合わせた結果の文字列よりも充分大きな領域が確保されていなくてはいけません。 今回の第一引数は、"Result"という文字列定数です。文字列定数は、文字の配列として解釈され、そのアドレスは、先頭文字を指すchar *として解釈されます。従って、コンパイルは通るのですが・・・ 当然のことながら、文字列定数の指すアドレスは書き込み「禁止」です。これは、実装次第という側面はありますが、文字列「定数」のあり方として、そうあるべきです。(ちなみに、言語規約では、書き込み禁止のメモリー領域に配置できるとあります。)また、その領域の大きさは、"Result"を書き込める最小の大きさ(末尾の\0を入れて、おそらく7バイト)です。 二重の意味で、前提条件を満たしていませんよね。 多分、書き込み禁止領域に書き込みをしようとして、ランタイムエラーではじかれています。とても親切な実装です。もし、書き込み可能な領域に、この定数が配置されていたら、もっと訳のわからないトラブルに巻き込まれたことでしょう。なぜなら、本来確保した領域の外側へ書き込みを始めるからです。もちろん、隣の領域は、他の変数の領域です。他のルーチンの変数領域かもしれません。そこを平然と踏みつぶしているわけですから、もう何が起きても不思議ではありません。(不幸にも、この隣の領域がシステム領域だっり実行コード領域だったりした時に、とてつもないセキュリティーホールが発生することになります。) ほかにも、すごく、冗長なアドレスの表記など、まだ、もう少し、ポインターと配列の関係の理解が不足しているなと思われる場所が散見されます。 ゆっくりと、ポインターの学習を深められることをお勧めします。
お礼
ご指摘、どうも有難うございました。
- wormhole
- ベストアンサー率28% (1626/5665)
strcatの仕様をよく確認しましょう。
お礼
どうもありがとうございました。