• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:EAccessViolationクラス例外)

EAccessViolationクラス例外の原因と解決方法

このQ&Aのポイント
  • WindowsXPでBCB5を使用している場合、文字列の反転関数でEAccessViolationクラスの例外が発生することがあります。
  • この問題は、文字列の長さに関する不具合が原因で起こる可能性があります。
  • 解決方法としては、文字列の長さを適切に管理し、メモリのアクセスエラーを防ぐようにすることが重要です。

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

  • ベストアンサー
noname#137556
noname#137556
回答No.5

> 文字列のコピーを作りたかったので、char* tmp="";等と初期化してやってみてどうしてもうまく行きませんでした ANo.4 でも書きましたが,この場合 tmp (が指している先)を書き換えてはいけません。 (const char* tmp=""; とすべき) コピー元の文字列(終端のナル文字含む)を格納するのに十分なサイズのコピー先を自分で用意してやる必要があります。 const char *src = "abcd"; // コピー元 char dst[256];         // コピー先 strcpy(dst, src);  // src (が指している先にある文字列)を dst にコピー

yoshiyossy
質問者

お礼

度々の回答ありがとうございます。 >ANo.4 でも書きましたが,この場合 tmp (が指している先)を書き換えてはいけません。 >(const char* tmp=""; とすべき) char dst[256]; strcpy(dst, src); とすると正常に目的の結果が得られました。   ポインタはこういうものだと理解しておきます。

その他の回答 (4)

noname#137556
noname#137556
回答No.4

他にもまずいところがあって,  char* s="abcd"; と宣言した場合,s の内容を書き換えてはいけません。  char s[] = "abcd"; なら OK。 # 文字列の先頭と末尾から,文字単位で入れ替えていけば, # 文字列のコピーを作らなくても大丈夫ですよ。

yoshiyossy
質問者

お礼

ありがとうございます。 文字列のコピーを作りたかったので、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)
回答No.3

tmpが参照するべき実体がありません。 実体がないので > *(tmp+i)=*(s+len-1-i); は「どことも知れないメモリ」にアクセスしようとします。結果としてOS側で不正なメモリアクセスを検知して例外を送出します。 あと、どうでもいい部類には入りますが、 > *(tmp+len)=NULL; 「ヌルポインタ(NULL)」と「ヌル文字('\0')」は(C++の範疇では)同じ値を示しますが、概念としては別モノです。 文字列終端のヌル文字の代用にNULLを使うのは避けた方がいいでしょう。

yoshiyossy
質問者

お礼

ありがとうございます。 >>「ヌルポインタ(NULL)」と「ヌル文字('\0')」は(C++の範疇では)同じ値を示しますが、 >>概念としては別モノです。 >>文字列終端のヌル文字の代用にNULLを使うのは避けた方がいいでしょう。 まだポインタの概念を良く理解してない為、参考にさせていただきます。

回答No.2

# ご参考: 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'; }

yoshiyossy
質問者

お礼

ありがとうございます。 勉強中なのでrevrese()は知りませんでしたが、うまく行きました。 revrese()無しでもやってみます。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

tmpが領域確保されてないのに、未初期化のままデレファレンスしてるからでは。 詳しいことは、他の人が回答してくれるかと。

yoshiyossy
質問者

お礼

ありがとうございます。他の人の回答も参考にさせていただきます。