- ベストアンサー
C++ : cout << (数字) で実行時エラーが発生する理由
ある特定の位置でcout を用いて数字を表示しようとするとエラーが発生してしまいます。 具体的には以下の関数内でのことなのですが、原因の分かる方がいましたら解答お願いします。 受け取った文字列を逆順にする関数です。 ---------------------------------------------------------- void rev_str(char *a) { int length = 0; cout << length; // ここでエラーが発生 while(true) { if(*(a + length) == '\0') break; length++; } for(int i = 0; i < length / 2; i++) { char temp = a[i]; a[i] = a[length - i - 1]; a[length - i - 1] = temp; } } --------------------------------------------------------- エラーの発生する部分ですが、数字ではなく文字・文字列なら問題なく表示されます。 このコードでは変数 length を表示しようとしていますが、length でなくても、またどのような『数』でも『この関数内』で cout を使用するとエラーが発生します。 この関数に何か間違いがあるのではないかと思うのですが、どうにも見つけることが出来ません。 コード全体はこの下に掲載します。 cout に何か制約があるのでしょうか。それとも、やはりコードのどこかに誤りがあるのでしょうか。わかる方がいましたら、解答お願いします。 全コード ------------------------------------------------------ #include <iostream> #include <cstring> using namespace std; void rev_str(char *a); void rev_str(const char *source, char *des); int main() { char a[80], b[80]; strcpy(a, "hello, world!"); rev_str(a, b); rev_str(a); cout << a << "\n"; cout << b << "\n"; return 0; } void rev_str(char *a) { int length = 0; cout << length; while(true) { if(*(a + length) == '\0') break; length++; } for(int i = 0; i < length / 2; i++) { char temp = a[i]; a[i] = a[length - i - 1]; a[length - i - 1] = temp; } } void rev_str(const char *source, char *des) { char *a = (char*)malloc(sizeof(source)); strcpy(a, source); rev_str(a); strcpy(des, a); free(a); }
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> void rev_str(const char *source, char *des) > { > char *a = (char*)malloc(sizeof(source)); > strcpy(a, source); > rev_str(a); > strcpy(des, a); > free(a); > } の中でmallocで確保されるサイズは sizeof(source)なので char型のポインタサイズ ... 32Bit環境なら4バイトってことになります その領域に対して strcpyを実行するので4バイト以上の文字列をコピーすればメモリー領域が破壊されます NULL終端の文字列が対象なら char *a = (char*)malloc( strlen( source ) ); といった具合に変更してみましょう
その他の回答 (4)
- jacta
- ベストアンサー率26% (845/3158)
不具合の直接の原因は既に回答が出ているとおりです。 しかし、根本的な解決方法は別にあるかと思います。それは、非標準関数の strdup を使うことではなく、標準関数テンプレートの std::reverse および std::reverse_copy を使うことです。 これにより、rev_str 関数は二つとも不要になります。
お礼
回答ありがとうございます。 今回は関数のオーバーロードの演習でこのようなコードを書きました。 標準関数テンプレートに関しては、勉強不足でして、恥ずかしながらいまだに名前しか知らない状態です。 今後学習する予定もありますし、使える物は使っていこうと思います。
- sakusaker7
- ベストアンサー率62% (800/1280)
志村、+1、+1>#3
- sakusaker7
- ベストアンサー率62% (800/1280)
素直に strdup 使っていればこういう目にあわずにすんだのに //char *a = (char*)malloc(sizeof(source)); //strcpy(a, source); char *a = strdup(source); rev_str(a); strcpy(des, a); free(a); } デバッガで追いかけて、malloc で何バイト確保しようとしているか よーく見てみてください。
お礼
回答ありがとうございます。 無事問題を解決することが出来ました。 便利な関数が多々あるようなので、できるだけ使えるように頑張ろうかと思います。
- shirayukix
- ベストアンサー率43% (90/207)
coutではなく、それより後のメモリ操作に問題があるのではないですか? ついでですから、coutの後のあちこちにcoutを書いて変数の値を出力してみたらいいと思います。
お礼
回答ありがとうございます。 そうですね。問題はメモリ操作にあったようです。 どこに間違いがあるのかわからないのが怖いですね。今後は気をつけたいです。
お礼
回答ありがとうございます。 問題の関数ばかりに気をとられていて気づきませんでした。今後は気をつけていこうと思います。 詳細な回答ありがとうございました。