IT情報@PRO人

C言語 練習問題 17

この記事は2016年8月15日に書かれたものです。内容が古い可能性がありますのでご注意ください。


C言語練習問題

C言語練習問題

環境について

C言語の練習問題です。

開発環境は以下の通り。

PC:MacBook Pro 2011early 15inch

OS:Windows 8.1(デュアルブート)

メモリ:16GB(8GB x 2)

CPU:Core i7-2635QM 2.00GHz

コンパイラ:MinGW-w64 5.3.0 (posix, sjlj)

 

※問題文に書いてあるプログラムを実行する際は自己責任で実行してください。

※※各問題へのリンク一覧を作成しました。

 

問題

次のプログラムを作った。コンパイル、実行に関して以下の問いに答えよ。

 

プログラム(test17.c)

#include <stdio.h>
#include <stdlib.h>
#include "myStruct.h"
#include "myFunc.h"

int main(void){
  Student_t* student = (Student_t*)malloc(sizeof(Student_t));
  setName(student);
  student->age = 20;
  printf("%s\n", student->name);
  printf("%d", student->age);
  free(student);
  return 0;
}

プログラム(myStruct.h)

typedef struct Student{
  char name[16];
  int age;
}Student_t;

プログラム(myFunc.h)

#include <string.h>
#include "myStruct.h"

void setName(Student_t* student);

void setName(Student_t* student){
  strcpy(student->name, "TECH");
  return;
}

 

問1.次のコマンドをコマンドプロンプトから打ち込んだ。どのような結果になるか。

A,B,Cの選択肢から適切なものを選べ。また、選んだ選択肢の中の空欄を埋めよ。

なお、コマンドを入力する前はディレクトリ内のファイルはtest17.cとmyStruct.h、myFunc.hの3つのファイルのみであった。

gcc -o test17.exe test17.c -O3

 

選択肢A,B,C

A.コンパイル成功して(空欄1)が生成される

B.(空欄1)ためコンパイルエラー

C.コマンドの(空欄1)の部分が間違っているためコンパイルが実行されない

 

 

問2.その後、次のコマンドをコマンドプロンプトから打ち込んだ。どのような結果になるか。 A,B,Cの選択肢から適切なものを選べ。また、選んだ選択肢の空欄を埋めよ。

 test17

 

選択肢A,B,C

A.ファイルが実行され(空欄1)と画面に表示される。

B.(空欄1)というファイルがないため実行できない

C.コンパイルはされているが、実行ファイルに(空欄1)という問題があるため実行ができない

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

解答

問1

B.( 二重インクルードが発生する )ためコンパイルエラー

※該当内容が指摘できていれば正解とする。解説参照。

 

問2

B.( test17.exe )というファイルがないため実行できない

 

解説

問1,問2

今回は構造体を利用しており、構造体の定義はヘッダファイル(myStruct.h)に記述している。また、それとは別に、関数を定義しているヘッダファイル(myFunc.h)も定義している。

test17.cは、myFunc.hとmyStruct.hをincludeしている。また、myFunc.hもmyStruct.hをincludeしている(下図参照)。

include

myStruct.hの中では構造体Student_tを定義している。test17.cではmyStruct.hとmyFunc.hをincludeしているが、myFunc.hでもmyStruct.hをincludeしている。そのため、test17.cではmyStruct.hが2回includeされていることになる。

したがって、test17.cではStudent_tが2回定義されてることになる。同名の構造体が2つ以上定義されていることになりコンパイルエラーとなる。

 

これを避けるためにはヘッダファイル内でインクルードガードを記述する。以下、myStruct.hにインクルードガードを記述した例(1、2、7行目がインクルードガード)。
プログラム(myStruct.h)

#ifndef MYSTRUCT_H
#define MYSTRUCT_H
typedef struct Student{
  char name[16];
  int age;
}Student_t;
#endif

これでコンパイル、実行ができる。実行結果は以下の通り。

> gcc -o test17.exe test17.c -O3
> test17
TECH
20

 

インクルードガードも含め、ヘッダファイルの記述は正しく行う必要がある。

参考(外部リンク):C言語の正しいヘッダファイルの書き方

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

PAGE TOP