- ベストアンサー
strcpyについて。
strcpyを自分で実装しようと考え、以下のような関数を作成しました。 void my_strcpy(char* buff1, char* buff2){ while(*buff2 != '\0') *buff1++ = *buff2++; *buff1 = '\0'; } この記述でコンパイラは通るのですが、実行時に *buff1++ = *buff2++; の部分で落ちてしまいます。 エラーは”ハンドルされていない例外が発生しました”と問いかけてきます。 なにがいけないのでしょう?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> char* str1 = "ABCDEFG"; > char* str2 = "HIJKLMN"; > 最初の定義の部分では、文字列のポインタしかメモリが確保されておらず、文字列自体の空間が確保されていなかったと見るべきでしょうか? おおむねその通りです。 ついでに、"ABCDEFG"と"HIJKLMN"が読み取り専用の領域に配置されている可能性もあります。 その場合、書き換えようとすればアクセス違反となります。 http://www.google.co.jp/search?num=20&hl=ja&q=%E6%96%87%E5%AD%97%E5%88%97%E3%83%AA%E3%83%86%E3%83%A9%E3%83%AB+%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88&btnG=%E6%A4%9C%E7%B4%A2&lr=lang_ja
その他の回答 (2)
- tatsu99
- ベストアンサー率52% (391/751)
この関数自体に問題があるのではなく、この関数の呼び出し方に問題があります。どのような呼び出し方をしたのか、そのソースを提示して下さい。(本物のstrcpyも呼び出し方が悪いと、同じ現象が発生します)
補足
回答ありがとうございます。 何とか解決することができました。 そして、ソースを記述せず申し訳ありませんでした。以下がエラーが発生するソースです。動作するかの検証だったので、とても単純です。 int main(void){ char* str1 = "ABCDEFG"; char* str2 = "HIJKLMN"; my_strcpy( str1, str2 ); printf("%s", str1); } 最初の定義の部分では、文字列のポインタしかメモリが確保されておらず、文字列自体の空間が確保されていなかったと見るべきでしょうか?
- hitokotonusi
- ベストアンサー率52% (571/1086)
buff1, buff2が指す実体が確保されてないんじゃないですか。 あるいは、確保してあってもbuff1用に確保したサイズが buff2が指す文字列の長さよりも小さい。
お礼
回答ありがとうございました。 結果としてうまく動かすことに成功しました。 問題だったのはこの関数ではなく、char配列の確保の仕方に問題がありました。 上の方の回答の返信にソースを載せます。 まぁはっきりいって明確なのですが・・・・ 助かりました。ありがとうございました。
お礼
回答ありがとうございました。 アドバイス、また紹介していただいたページで問題を解決することができました。 ありがとうございました。