見出し画像

C言語で Java Silver レベルの問題を作ってみる No.27

 プログラミング言語って、しばらく触れてないと細かな部分を忘れてしまいますよね。また、複数のプログラミング言語を習得している人は、頭がこんがりますね。

 そんな方におススメしたいのが、資格試験の問題を1日5問程度解いていく方法です。毎日のスキマ時間を活用して短時間で知識レベルを維持することが出来ますよ。Javaならば、Silverの問題集が最適です。
 Silverを既に取得している人も、これから取得を目指している人もぜひ試してみてください。

 さて、この記事では、タイトルの通り、C言語をテーマにしています。
問題を毎日5問投稿していきますので、C言語を習得中の方、C言語の知識を維持されたい方は、ぜひご活用ください。


■ 開発の効率化

□ 1. 次のメモリを動的に確保するプログラムの空欄に入るコードとして、正しいものを選びなさい。(1つ選択)

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *arr = malloc(5 * sizeof(int));
    if (__空欄____) {
        printf("メモリ確保に失敗しました。\n");
        return 1;
    }
    // 省略
    free(arr);
    return 0;
}

A.     arr == NULL
B.  arr != NULL
C.  arr == null  
D.  arr != null


□ 2. メモリの動的確保に関する説明として正しいものを選びなさい。(1つ選択)

A.  mallocはメモリを確保した後、自動的に初期化を行う。
B.  free関数は、動的に確保したメモリを解放するために使用される。
C.  動的メモリは、スタックに保存される。
D.  callocは指定したサイズのメモリを確保するが、初期化は行わない。


3. volatile修飾子に関する説明として正しいものを選びなさい。(1つ選択)

A.    volatileは変数の値を常にキャッシュすることを保証する。
B.  volatile変数は、コンパイラの最適化を防ぎ、変数が外部要因によって変更される可能性があることを示す。
C.  volatileはメモリの動的確保に関連する。
D.  volatile変数は、プログラムが実行される前に自動的に初期化される。


□ 4. 次のMakefileを用いて、makeコマンドを実行したときの出力結果を選択してください。(1つ選択)

CC = gcc
CFLAGS = -Wall
TARGET = program

all: $(TARGET)

$(TARGET): main.o utils.o
	$(CC) $(CFLAGS) -o $(TARGET) main.o utils.o

main.o: main.c
	$(CC) $(CFLAGS) -c main.c

utils.o: utils.c
	$(CC) $(CFLAGS) -c utils.c

A.    gcc -Wall -o program main.o utils.o
B.  gcc -Wall -c main.c
C.  gcc -Wall -c utils.c
D.  コンパイルエラー

□ 5. Makefileに関する説明として正しいものを選びなさい。(1つ選択)

A. Makefileは、ソースコードの自動生成を管理するためのファイルである。
B.  Makefileは、コンパイラの種類に依存しないため、常に同じ方法でコンパイルされる。
C.  Makefileは、特定の順序でコマンドを実行することができ、依存関係を管理するために使用される。
D.  Makefileは、プログラムの実行時のパラメータを指定するために使用される。


解答

1.A

A. arr == NULL
正解です。
malloc関数は、メモリ確保に失敗した場合にNULLを返します。このため、if (arr == NULL)という条件でメモリ確保が成功したかを確認するのが正しい方法です。
B. arr != NULL
不正解です。
これはメモリ確保が成功した場合の条件ですが、条件が成立した際にエラーメッセージを表示するのは誤りです。
C. arr == null
不正解です。
C言語ではNULLが正しい表記であり、nullは無効です。正しくは大文字のNULLを使う必要があります。
D. arr != null
不正解です。
C言語ではNULLが正しい表記であり、nullは無効です。また、条件が成立した場合にエラーメッセージを表示するのも誤りです。


2.B

A. 不正解です。
mallocはメモリを確保しますが、そのメモリは初期化されません。確保したメモリには未定義の値が入っています。
B. 正解です。
free関数は、mallocやcallocなどで動的に確保したメモリを解放するために使用されます。メモリリークを防ぐために重要な関数です。
C. 不正解です。
動的メモリはヒープ領域に保存され、スタックとは異なる管理方法が用いられます。スタックは関数の呼び出しに関連したメモリ領域です。
D. 不正解です。
callocはメモリを確保する際に、そのメモリをゼロで初期化します。したがって、この説明は誤りです。

3.B

A. 不正解です。
volatileは変数の値をキャッシュしないことを意味します。むしろ、volatile修飾子は、変数の値を毎回メモリから読み取ることを指示します。
B. 正解です。
volatile修飾子は、変数が外部の要因(例えば、ハードウェアや他のスレッド)によって変更される可能性があることを示し、その結果、コンパイラの最適化を防ぎます。これにより、変数の最新の値が常に参照されることが保証されます。
C. 不正解です。
volatileは動的メモリ確保とは無関係です。動的メモリ確保はmallocやcallocなどの関数によって行われ、volatileとは異なる概念です。
D. 不正解です。
volatile修飾子は変数の初期化に関与しません。volatile変数は、他の変数と同様に初期化が必要です。

4.A

Makefileの内容:
CC = gcc: コンパイラとしてgccを指定しています。
CFLAGS = -Wall: コンパイル時のオプションとして、全ての警告を表示する-Wallを指定しています。
TARGET = program: 出力ファイル名をprogramに設定しています。

all: $(TARGET): makeコマンドでallを指定すると、$(TARGET)(つまりprogram)をビルドします。

$(TARGET): main.o utils.o: programをビルドするためには、main.oとutils.oが必要です。この行が実行されるとき、以下のコマンドが実行されます。

$(CC) $(CFLAGS) -o $(TARGET) main.o utils.o

main.oとutils.oのビルドルールもあり、それぞれ次のようにコンパイルされます。

$(CC) $(CFLAGS) -c main.c
$(CC) $(CFLAGS) -c utils.c

選択肢を確認します。
A) gcc -Wall -o program main.o utils.o
正解です。
makeを実行すると、programをビルドするために、main.oとutils.oをリンクするコマンドが実行されます。

B) gcc -Wall -c main.c
不正解です。
これはmain.oをコンパイルするコマンドですが、makeの最終出力としては表示されません。

C) gcc -Wall -c utils.c
不正解です。
これもutils.oをコンパイルするコマンドですが、最終出力ではありません。

D) コンパイルエラー
不正解です。
正しいMakefileなので、コンパイルエラーは発生しません。


5.C

A. 不正解です。
Makefileは主にビルドプロセスを自動化するために使用されますが、「ソースコードの自動生成」という表現は不正確です。ソースコードを生成するのではなく、既存のソースコードをコンパイルしてプログラムを作成します。

B. 不正解です。
Makefileの内容は、指定されたコンパイラ(例えばgccやclangなど)によって異なる結果を生む可能性があります。また、オプションや設定に依存するため、常に同じ方法でコンパイルされるわけではありません。

C. 正解です。
Makefileの主な役割は、ターゲットの依存関係を管理し、必要なコマンドを特定の順序で実行することです。これにより、変更があった場合にのみ再ビルドを行うことができます。

D. 不正解です。
Makefileは主にビルドプロセスに関連する設定を管理するものであり、プログラムの実行時のパラメータを指定するためには使用されません。実行時のパラメータは通常、コマンドライン引数として渡されます。



本日の学習内容

お疲れ様でした。
継続は力なりです。
明日も頑張りましょう!

この記事が気に入ったらサポートをしてみませんか?