Thinkers'Studio
JavaとC言語の自習ツール
ポインタの間違い探し

 まず、ポインタについて簡単にまとめました。

ポインタについての整理

【 前提 】  ポインタは特定のデータ型のデータがある場所を指す "所在" の情報だ

【 準備 】
  1. 宣言 − どんなデータ型を指すどんな名前のポインタを用意するかを宣言する
  2. 代入 − 宣言したポインタに、有効なデータのアドレス(所在)を代入する
【 使う 】
  1. データの参照  − ポインタが指す場所のデータの値を取り出す
  2. データの更新  − ポインタが指す場所のデータを書き換える
  3. ポインタの操作 − ポインタが指す場所を変える

(今回のクイズです)
 次のプログラムをコンパイルして実行すると、Segmentation fault で落ちました。
 どこが間違っているのでしょうか? ポインタについての整理(上記)と見比べてください。
#include <stdio.h>
main()
{
    int     *p;

    *p = 3;
    printf( "%d\n", *p );
}
 別な環境で同じプログラムを実行すると、今度は 3 と表示されました。
 なぜ、そんなことが起こるのかも推測してみてください。
  (答えは、次回のC言語の Tips で ・・・)

[ 関連記事 ] 用語集:ポインタ, Tips:配列とポインタのクイズ(1), 同(2), 同(3), NULLポインタ
[ ご案内 ] ポインタの要点を学習できるコース:要点講座 [配列とポインタ編]

前回のクイズの答え:  (前回の問題を見る
1箇所目(正)if( (fp = fopen( "data.txt", "r" )) == NULL )
        (誤)if( fp = fopen( "data.txt", "r" ) == NULL )
 ( ) がないと、優先度の高い == が = より先に評価され、fp にオープンしたファイルへのポインタが入りません。
2箇所目(正)while( (c = fgetc( fp )) != EOF )
        (誤)while( c = fgetc( fp ) != EOF )
 こちらも ( ) がないと、= より先に != が評価されます。 ファイルから読んだ文字でなく、fgetc( fp ) != EOF の評価結果が c に代入されるのでうまくいきません。
 (誤)はどちらもコンパイル時にエラーにならないので、注意が必要です。