1ヶ月でWebデザイン・プログラミングスキルをオーダーメイドのカリキュラムで学べるスクール、それがWebCamp。

子供の想像力を伸ばしアイデアを形にする小学生向けプログラミング教室「プロスタキッズ」

初心者が陥りやすいエラー、コンパイルエラー解消法(C言語編)まとめ

Pocket

C言語のコンパイラやプログラムが吐き出すエラーメッセージは、専門的な用語が多いため、初心者がつまずきやすいポイントになります。
そこで今回は、初心者が陥りやすいC言語のエラーやコンパイルエラーの例と解消法をご紹介します。

コンパイルエラー

変数名’ undeclared

undeclaredとは、「申告していない」という意味。つまり、このエラーメッセージは「宣言されていない変数を使っていますよ」と言っています。
C言語の処理中で変数を使用する場合は、使用前に必ず変数宣言をしなければいけません。変数の宣言漏れがないか、変数名のスペルを間違えていないかを確認してみましょう。

undefined reference to 関数名'

直訳すると「関数名’への未定義の参照」。定義されていない関数を呼び出そうとしている時に起こるエラーです。
関数名のスペルミスはないか、関数を定義しているヘッダファイルのinclude漏れがないか、リンクするライブラリの指定を誤っていないか確認してください。

invalid preprocessing directive

無効なプリプロセッサがある場合に表示されます。プリプロセッサとは、ソースプログラムに対して行われる前処理のことです。
ソースの頭部分、include周辺を見直してみましょう。

syntax error before “コマンドなど”

syntaxは「構文、文法」を意味します。よって、このエラーは「ソースファイル上の”コマンドなど”の前に文法エラーがありますよ」ということです。
大抵はエラー文言通りに”コマンドなど”の前行を探せばバグを見つけることが出来るのですが、稀に後ろの行にバグが潜んでいるケースもあります。前行を見てもバグが見つからない場合は、直後の行も探してみてください。

実行時エラー

No such file or directory

コンパイル時にも出てくるエラーです。エラーの意味は英文そのままで「そのようなファイルやディレクトリは存在しません」ということ。
プログラム上で指定しているファイルが存在しない場合に表示されます。指定ファイル名やファイルパスが誤っていないか、動的にパスを生成している場合は処理内容に問題がないかチェックしてみましょう。

Buffer overrun

予め用意していたバッファ(Buffer)の大きさを超えてデータを書き込んでしまうことです。
例えば、100文字分の領域をバッファとして用意していたところに、101文字目を代入しようとした時にBuffer overrunが発生します。
代入する側・される側両方のサイズが妥当かを確認してみましょう。

Buffer overflow

「バッファが溢れてしまった」ということを意味しています。上で解説しているBuffer overrunとほぼ同じ内容のエラーです。
代入元・先のサイズを再確認してください。

Segmentation Fault(SIGSEGV)

本来、存在していないメモリ領域を参照してしまった時に起こるエラーです。UNIX系OSでは「SIGSEGV」と表示されます。
ループ処理の中でよく起きるエラーです。ループ内で参照先のアドレスを計算している部分や、無限ループ・無限再起を起こしていないかチェックしてみましょう。
また、コンパイル時にコアファイルを出力するようオプション設定しておくと、解析のヒントを得られます。

Buffer overrun・Buffer overflow・Segmentation Faultの違い

混合しやすい3つのエラーですが、上の図のような違いがあります。
Buffer overrunとBuffer overflowは同じ意味で使われることが多いのですが、前者は「止まるべき所で止まらず、先へ進んでしまった」エラー、後者は「データが溢れてしまった」というエラーです。例外はありますが、Buffer overrunは主にデータの読み込み時、Buffer overflowは書き込み時に発生します。
いずれも重大なセキュリティホールとなり得るエラーです。絶対に放置せず、修正するようにしましょう。

scanf()やstrcpy()、gets()はBuffer overrun・Buffer overflow・Segmentation Faultを起こしやすい関数です。使用する直前に厳重なサイズチェックを追加するか、代入するサイズを指定出来るstrncpy()、fgets()などに置き換えることをおすすめします。

おわりに

いかがでしたか。
初心者が陥りやすいエラーについてまとめました。エラーが起きた際にはなぜエラーが起こっているのか原因を突き止める作業が必要になります。今回紹介した内容を参考にしていただければ幸いです。

投稿者:プロスタ編集部

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

初心者がプログラミングで挫折しない学習方法を無料動画で公開中。オンラインに特化したプログラミングスクール「TechAcademy(テックアカデミー)」が解説。

この記事が気に入ったら
いいね!しよう

プロスタの最新情報をお届けします

あわせて読みたい

関連記事

ページ上部へ戻る