- ベストアンサー
EAccessViolationクラス例外の原因と解決方法
- WindowsXPでBCB5を使用している場合、文字列の反転関数でEAccessViolationクラスの例外が発生することがあります。
- この問題は、文字列の長さに関する不具合が原因で起こる可能性があります。
- 解決方法としては、文字列の長さを適切に管理し、メモリのアクセスエラーを防ぐようにすることが重要です。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
> 文字列のコピーを作りたかったので、char* tmp="";等と初期化してやってみてどうしてもうまく行きませんでした ANo.4 でも書きましたが,この場合 tmp (が指している先)を書き換えてはいけません。 (const char* tmp=""; とすべき) コピー元の文字列(終端のナル文字含む)を格納するのに十分なサイズのコピー先を自分で用意してやる必要があります。 const char *src = "abcd"; // コピー元 char dst[256]; // コピー先 strcpy(dst, src); // src (が指している先にある文字列)を dst にコピー
その他の回答 (4)
他にもまずいところがあって, char* s="abcd"; と宣言した場合,s の内容を書き換えてはいけません。 char s[] = "abcd"; なら OK。 # 文字列の先頭と末尾から,文字単位で入れ替えていけば, # 文字列のコピーを作らなくても大丈夫ですよ。
お礼
ありがとうございます。 文字列のコピーを作りたかったので、char* tmp="";等と初期化してやってみてどうしてもうまく行きませんでしたが、おっしゃられる通り char tmp; for(int i=0;i<=(len/2-1);i++){ tmp=*(s+i); *(s+i)=*(s+len-1-i); *(s+len-1-i)=tmp; } として、文字単位で入れ替えてみると正常に終了しました。
- D-Matsu
- ベストアンサー率45% (1080/2394)
tmpが参照するべき実体がありません。 実体がないので > *(tmp+i)=*(s+len-1-i); は「どことも知れないメモリ」にアクセスしようとします。結果としてOS側で不正なメモリアクセスを検知して例外を送出します。 あと、どうでもいい部類には入りますが、 > *(tmp+len)=NULL; 「ヌルポインタ(NULL)」と「ヌル文字('\0')」は(C++の範疇では)同じ値を示しますが、概念としては別モノです。 文字列終端のヌル文字の代用にNULLを使うのは避けた方がいいでしょう。
お礼
ありがとうございます。 >>「ヌルポインタ(NULL)」と「ヌル文字('\0')」は(C++の範疇では)同じ値を示しますが、 >>概念としては別モノです。 >>文字列終端のヌル文字の代用にNULLを使うのは避けた方がいいでしょう。 まだポインタの概念を良く理解してない為、参考にさせていただきます。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
# ご参考: C++なんだからそんなものわざわざ自作せんでも... #include <iostream> #include <cstring> #include <algorithm> // 追加 using namespace std; char* str_rvs(char* s){ std::reverse(s, s+strlen(s)); // これでオシマイ return s; } int main(){ char s[] = "abcd"; cout << "文字列[" << s << "]を反転します。\n"; cout << str_rvs(s) << '\n'; }
お礼
ありがとうございます。 勉強中なのでrevrese()は知りませんでしたが、うまく行きました。 revrese()無しでもやってみます。
- osamuy
- ベストアンサー率42% (1231/2878)
tmpが領域確保されてないのに、未初期化のままデレファレンスしてるからでは。 詳しいことは、他の人が回答してくれるかと。
お礼
ありがとうございます。他の人の回答も参考にさせていただきます。
お礼
度々の回答ありがとうございます。 >ANo.4 でも書きましたが,この場合 tmp (が指している先)を書き換えてはいけません。 >(const char* tmp=""; とすべき) char dst[256]; strcpy(dst, src); とすると正常に目的の結果が得られました。 ポインタはこういうものだと理解しておきます。