• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:配列の初期化時に出たエラーの原因について)

配列の初期化時に出たエラーの原因について

このQ&Aのポイント
  • プログラムの学習を行っていた時に、配列の初期化時にエラーが発生しました。
  • エラーメッセージは「undefined reference to '_memcpy'」でした。
  • 修正したコードではエラーが発生しなくなりましたが、なぜエラーが直ったのか知りたいです。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

変数領域の確保する場所ややり方、初期化のしかたが、それぞれで違うからです。 どのように違うかは、「記憶クラス」をキーワードに検索する等してください。 おもいっきり雑な言い方をすれば。 外に書いたものは、初期化された領域に、変数を割り当てる(から、特にコピーなどはしない) 中に書いたものは、変数に領域を割り当てて、そこを初期化する(その際に、今お使いのものでは、標準ライブラリのmemcpyを利用しているようだ) ということです。

kirita
質問者

補足

そういうことでしたか! ようやく分かりました。ありがとうございます。 以前、変数領域についても調べたことがあったのでkmeeさんの内容で理解出来ました。 中に書いた変数って書き換えられる領域にコピーしてから使用するんでしたっけ。 その時に標準ライブラリを使用していたのですか…。 確かにそれだと-nostdlib 指定していても問題なかった理由が分かります。 もう一度、記憶クラスの内容を理解しておこうと思います。 本当にありがとうございました。

その他の回答 (4)

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

main「文」ってのはどうにかならないものでしょうか。 ちゃんとmain「関数」って書いてほしいなぁ、なんて思ったり。

kirita
質問者

お礼

どうも初めてC言語を教えて下さった方がそういう言い方をしていたので、 うつってしまったようで…不快にさせてしまい申し訳ありません。 今のうちに直しておきます。

回答No.3

一口にC言語といっても様々なバージョンが存在します。 K&Rといわれていた古い版ではその記法がエラーとされる事もありました。 C言語の仕様上、ANSI C(C89)以降使える様に変わっています。 でも、今使われているgccならANSI C以降の仕様のはずだけどな。 だとしたら、コンパイラにそういう指示をしているのではないかな。 マイコン制御とかで-nostdlibオプション使ったりしてませんか。 その場合、標準関数使うためには-lcでcライブラリ(標準関数)使う様にリンクしてやれば良さそうな気がします。 > 書いた時にはコンパイルエラー undefined reference to '_memcpy' と出たのですが、 コンパイルエラーではなくてリンクエラーですね。

kirita
質問者

補足

勉強になります。ありがとうございます。 >マイコン制御とかで-nostdlibオプション使ったりしてませんか。 makefile見たら使ってました…。リンクする時にオプション指定してます。 ご指摘頂いた事は自分でも調べながら理解出来るようにしているのですが、 再度疑問が出てきたので質問させて下さい。 -nostdlibオプションは【コンパイラが標準のライブラリを自動的に参照しないよう指定します】と あったのですが、この意味だと標準関数は全く使えないことになるように受け取れました。 ですが実際、main文から初期化付きの配列を出すとリンク出来てしまうのがよく分かりません。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> 使用しているコンパイルソフトは「Cygwin」というものです。 Cygwinはコンパイラではありません。 CygwinのGCCでしょうか? それとも、別のターゲット用のクロスコンパイラでしょうか? (おそらく後者だと踏んでいます)

kirita
質問者

補足

色々と間違っていたみたいで、申し訳ありません。 コンパイラじゃなく開発ツールでした。 調べてみた結果、h8300-hms-gcc を使用していました。 別のターゲット用のクロスコンパイラで間違いないです。 Windowsで作ったプログラムをH8マイコンへ書き込んで使用しています。 無知なため何度も申し訳ありませんがよろしくお願い致します。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

原因は予想できていますが、念のため処理系を教えてください。

kirita
質問者

補足

すみません、処理系の意味が間違っているかもしれませんが、 コンパイラのことで良いのでしょうか…。 使用しているコンパイルソフトは「Cygwin」というものです。 よろしくお願いします。

関連するQ&A