• ベストアンサー

ptrcpy関数 コピーする領域の確保について

prcrpyを使い、コピーする領域の確保をわざと少なめにしたプログラムを 下のようにかいたのですが、エラーが出ません。 どうしてでしょうか? #include <stdio.h> #include <string.h> main() { char s[5] = "Hello"; printf("%s\n",s); strcpy(s,"Good bye") ; printf("%s\n",s); }

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

  • ベストアンサー
回答No.7

VC++2008EEをXPで使っています。 私の環境では少なくとも char s[5] = "Hello"; の時点で初期化子が多すぎますとエラーが出てビルドできませんでした。 次にs[6]にしてみると strcpyがunsafeなのでstrcpy_sを使っておくれとコンパイラが支持してくれました。(設定変更すると特定の警告出さないようにもできますが、私は一応そのままです。) ただ、変更しなくても警告は出るものの実行ファイルの生成自体は成功します。 それでも、strcpy(s,"Good bye"); ということが起きるため、不正終了までしてくれます。 ただ、デバッグで一行ずつ追っていくと、このままではその行ぴったりでコケるような感じではないようです。 もちろん、指示通りstrcpy_sにすれば strcpy_s(s,sizeof s,"Good bye"); の行を実行したときにコケてくれます。 もし大規模アプリケーションを組むことがありましたら、こういったことをしっかりチェックしてくれるコンパイラを採用することをおすすめします♪ ミスした場合にすぐに細かく教えてくれる可能性が高ければ、それだけ完成するコードに信頼感がありますからね。

yuukizx
質問者

お礼

回答ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (6)

  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.6

>printf("%s\n",s); s[]に終端'\0'がないため、'\0'を見つけるまで ゴミを吐き出す、という意味では問題あり。

yuukizx
質問者

お礼

回答ありがとうございます。

すると、全ての回答が全文表示されます。
回答No.5

  >char s[5] = "Hello";    この書き方自体は、問題ない。  

yuukizx
質問者

お礼

回答ありがとうございます。

すると、全ての回答が全文表示されます。
  • softimage
  • ベストアンサー率61% (68/111)
回答No.4

エラーはコンパイルエラーが出ないということですよね? 実行時のエラーは環境によって出たり出なかったりといったことが あります。 strcpy関数自体が第一引数の型さえ合っていればその先のことまでは チェックしないということではないでしょうか? C言語の便利な面でもあり、使い方を誤ると暴走の一因にもなる怖い 一面でもありますね。

yuukizx
質問者

お礼

回答ありがとうございます。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

未定義動作だから, どういう動作であってもおかしくない. エラーが出て止まるかもしれんし, 突然ハードディスクをフォーマットしだすかもしれんし, 鼻歌を歌い出すかもしれん.

yuukizx
質問者

お礼

回答ありがとうございます。

すると、全ての回答が全文表示されます。
回答No.2

>エラーが出ません。 「segment fault」や「access vioration」のことですか? 上記は「アクセスできない場所」に対してのアクセスで発生するものです。 >char s[5] = "Hello"; 程度の大きさではよほどのことがない限り発生しません。

yuukizx
質問者

お礼

回答ありがとうございます。

すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.1

>エラーが出ません。 >どうしてでしょうか? 破壊した領域に、他の誰もアクセスしようとしていないからです。 破壊してしまった場所に、次にアクセスしようとしたときに 何かよくないことが起きるかもしれません。 ところで、 >char s[5] = "Hello"; s[]の大きさが1バイト足りないことは理解できていますね?

yuukizx
質問者

お礼

>s[]の大きさが1バイト足りないことは理解できていますね? はい。 回答ありがとうございます。

すると、全ての回答が全文表示されます。

関連するQ&A