- ベストアンサー
配列の初期化時に出たエラーの原因について
- プログラムの学習を行っていた時に、配列の初期化時にエラーが発生しました。
- エラーメッセージは「undefined reference to '_memcpy'」でした。
- 修正したコードではエラーが発生しなくなりましたが、なぜエラーが直ったのか知りたいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
変数領域の確保する場所ややり方、初期化のしかたが、それぞれで違うからです。 どのように違うかは、「記憶クラス」をキーワードに検索する等してください。 おもいっきり雑な言い方をすれば。 外に書いたものは、初期化された領域に、変数を割り当てる(から、特にコピーなどはしない) 中に書いたものは、変数に領域を割り当てて、そこを初期化する(その際に、今お使いのものでは、標準ライブラリのmemcpyを利用しているようだ) ということです。
その他の回答 (4)
- asuncion
- ベストアンサー率33% (2127/6289)
main「文」ってのはどうにかならないものでしょうか。 ちゃんとmain「関数」って書いてほしいなぁ、なんて思ったり。
お礼
どうも初めてC言語を教えて下さった方がそういう言い方をしていたので、 うつってしまったようで…不快にさせてしまい申し訳ありません。 今のうちに直しておきます。
- saijyo_739
- ベストアンサー率53% (119/222)
一口にC言語といっても様々なバージョンが存在します。 K&Rといわれていた古い版ではその記法がエラーとされる事もありました。 C言語の仕様上、ANSI C(C89)以降使える様に変わっています。 でも、今使われているgccならANSI C以降の仕様のはずだけどな。 だとしたら、コンパイラにそういう指示をしているのではないかな。 マイコン制御とかで-nostdlibオプション使ったりしてませんか。 その場合、標準関数使うためには-lcでcライブラリ(標準関数)使う様にリンクしてやれば良さそうな気がします。 > 書いた時にはコンパイルエラー undefined reference to '_memcpy' と出たのですが、 コンパイルエラーではなくてリンクエラーですね。
補足
勉強になります。ありがとうございます。 >マイコン制御とかで-nostdlibオプション使ったりしてませんか。 makefile見たら使ってました…。リンクする時にオプション指定してます。 ご指摘頂いた事は自分でも調べながら理解出来るようにしているのですが、 再度疑問が出てきたので質問させて下さい。 -nostdlibオプションは【コンパイラが標準のライブラリを自動的に参照しないよう指定します】と あったのですが、この意味だと標準関数は全く使えないことになるように受け取れました。 ですが実際、main文から初期化付きの配列を出すとリンク出来てしまうのがよく分かりません。
- jacta
- ベストアンサー率26% (845/3158)
> 使用しているコンパイルソフトは「Cygwin」というものです。 Cygwinはコンパイラではありません。 CygwinのGCCでしょうか? それとも、別のターゲット用のクロスコンパイラでしょうか? (おそらく後者だと踏んでいます)
補足
色々と間違っていたみたいで、申し訳ありません。 コンパイラじゃなく開発ツールでした。 調べてみた結果、h8300-hms-gcc を使用していました。 別のターゲット用のクロスコンパイラで間違いないです。 Windowsで作ったプログラムをH8マイコンへ書き込んで使用しています。 無知なため何度も申し訳ありませんがよろしくお願い致します。
- jacta
- ベストアンサー率26% (845/3158)
原因は予想できていますが、念のため処理系を教えてください。
補足
すみません、処理系の意味が間違っているかもしれませんが、 コンパイラのことで良いのでしょうか…。 使用しているコンパイルソフトは「Cygwin」というものです。 よろしくお願いします。
補足
そういうことでしたか! ようやく分かりました。ありがとうございます。 以前、変数領域についても調べたことがあったのでkmeeさんの内容で理解出来ました。 中に書いた変数って書き換えられる領域にコピーしてから使用するんでしたっけ。 その時に標準ライブラリを使用していたのですか…。 確かにそれだと-nostdlib 指定していても問題なかった理由が分かります。 もう一度、記憶クラスの内容を理解しておこうと思います。 本当にありがとうございました。