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)
※問題文に書いてあるプログラムを実行する際は自己責任で実行してください。
※※各問題へのリンク一覧を作成しました。
問題
次のプログラムを作った。コンパイル、実行に関して以下の問いに答えよ。
プログラム(test19.c)
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> int main( void ){ int * p; int num = 10; *p = num; printf ( "num = %d\n" , num); printf ( "*p = %d\n" , *p); return 0; } |
問1.次のコマンドをコマンドプロンプトから打ち込んだ。どのような結果になるか。
A,B,Cの選択肢から適切なものを選べ。また、選んだ選択肢の中の空欄を埋めよ。
なお、コマンドを入力する前はディレクトリ内のファイルはtest19.cのみであった。
1 | gcc -o test19.exe test19.c |
選択肢A,B,C
A.コンパイル成功して( 空欄1 )が生成される。
B.( 空欄1 )ためコンパイルエラーが起こる。
C.コマンドの( 空欄1 )の部分が間違っているためコンパイルが実行されない。
問2.その後、次のコマンドをコマンドプロンプトから打ち込んだ。どのような結果になるか。 A,B,Cの選択肢から適切なものを選べ。また、選んだ選択肢の空欄を埋めよ。
1 | test19 |
選択肢A,B,C
A.ファイルが実行され( 空欄1 )と画面に表示される。
B.( 空欄1 )というファイルがないため実行できない。
C.コンパイルはされているが、( 空欄1 )という問題があるため実行結果は不定であり、実行は危険である。
解答
問1
A.コンパイル成功して( test19.exe )が生成される
問2
C.コンパイルはされているが、( ポインタの扱いが正しくない )という問題があるため実行結果は不定であり、実行は危険である。
※該当内容が指摘できていれば正解とする。解説参照。
解説
問1,問2
今回はポインタを利用している。ポインタとは指定したデータ型の変数のアドレスを示すものである。
ポインタを宣言する際は
1 | 変数のデータ型* 変数名; |
や
1 | 変数のデータ型 *変数名; //こちらでも可 |
という形で宣言可能である。以下はint型のポインタpの宣言例。
1 | int * p; |
や
1 | int *p; |
ポインタに値を代入する際はアドレス演算子&を利用する。
例:int型の変数numとint型のポインタpを利用
1 2 3 4 5 | int num = 10; int * p; p = # |
ポインタの指している変数の中身を利用したい場合は、間接参照演算子*を利用する。ポインタの宣言時も同じ*を用いるため紛らわしいので注意すること。
例:int型のポインタpが示すアドレスの中身を表示
1 2 3 4 5 6 7 | int num = 10; int * p; p = # printf ( "*p = %d" , *p); |
今回のプログラムはパッと見では問題が無いと考えそうになるが、7行目で非常に危険なことを行っている。
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> int main( void ){ int * p; int num = 10; *p = num; //該当箇所 printf ( "num = %d\n" , num); printf ( "*p = %d\n" , *p); return 0; } |
ポインタはメモリの上のアドレスを示す。今回int型のポインタpを利用しようとしている。しかし、7行目の段階ではpは何を指しているか不定である。7行目ではpの指しているメモリ上のアドレスに対して代入が行われているが、一体アドレス上のどこに対して行われているのかわからない。そのため、以降の挙動は不明である。また、他のプログラムが利用している領域を書き換えた場合には他のプログラムの動作に影響がでる。
今回のようなポインタの誤った使い方は非常に危険である。十分に注意すること。
なお、今回のプログラムは以下のようにすれば動く。
プログラム(test19.c)
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> int main( void ){ int * p; int num = 10; p = # printf ( "num = %d\n" , num); printf ( "*p = %d\n" , *p); return 0; } |
実行結果
1 2 3 4 | > gcc test19.c -o test19.exe >test19 num = 10 *p = 10 |
実践力が身につくC言語講座 連載リンク
競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載
アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載
パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載