【6日でできるC言語入門】NULLポインタへのアクセス

C言語でポインタを扱う際に、もっとも注意しなければならないのが「NULLポインタへのアクセス」です。
NULLポインタとは、どのメモリ領域も指していない(参照先が存在しない)ポインタ変数のことです。
 誤ってNULLポインタを使って値を読み書きすると、実行時エラーやプログラムの異常終了(クラッシュ)が発生します。

1.NULLポインタの基礎知識

1.1 NULLとは何か

用語意味
NULLポインタどのメモリ番地も指していないポインタ。意図的に「未使用」や「無効」を表す値。int* p = NULL;
未初期化ポインタアドレスがセットされていないポインタ。使用すると不定な動作となる。int* p; /* 初期化していない */

 NULLはC言語の標準定数で、ポインタ変数に「まだ有効なアドレスがセットされていません」という意味を持たせます。

1.2 NULLポインタへのアクセス例

サンプル:NULLポインタへの書き込みによるエラー

プロジェクト/ファイル名: Lesson52_1/main.c

#include <stdio.h>

int main(void) {
    double* ptr = NULL;   // double型のポインタをNULLで初期化
    *ptr = 3.14;          // NULLポインタを参照しようとする
    printf("値: %f\n", *ptr);
    return 0;
}

実行結果

重大度レベル	コード	説明
警告	C6011	NULL ポインター 'ptr' を逆参照しています。	

2.NULLポインタアクセスの危険性

2.1 なぜエラーになるのか?

状態結果
有効なアドレスを持つポインタ指した先の変数や配列に正常にアクセスできる。
NULLポインタ存在しないメモリ番地にアクセス → プログラム異常終了
  • NULLポインタを参照や書き込みに使うと、OSやCランタイムが「不正アクセス」とみなし、強制終了します。
  • エラー内容は「Segmentation Fault」や「アクセス違反」などと表示されます。

2.2 安全なプログラム作成のためのチェック

 NULLポインタを使う前に、必ず「NULLでないか」をチェックすることで、実行時エラーを防げます。

プロジェクト/ファイル名: Lesson52_2/main.c

#include <stdio.h>

void print_value(int* p) {
    if (p != NULL) {
        printf("値は%dです\n", *p);
    } else {
        printf("ポインタがNULLです(値を参照できません)\n");
    }
}

int main(void) {
    int* p = NULL;
    print_value(p);   // NULLなので安全に防御される
    return 0;
}

実行結果

ポインタがNULLです(値を参照できません)

3.よくあるエラーとNULLの使い方

3.1 よくあるNULLアクセスエラー例

状況エラー例解決策
初期化忘れのポインタint* p; *p = 10;int* p = NULL; で初期化
関数の戻り値チェック忘れfopenなどで失敗時NULLを返すのにチェックしない。戻り値がNULLか確認する。
解放後のアクセスfree(ptr); *ptr = 5;解放後はptr = NULL;

まとめ

  • NULLポインタは「どこも指していない」ことを示す特別な値
  • NULLポインタへアクセス(*pなど)は実行時エラーの原因!
  • 必ずポインタがNULLでないかを確認してから値にアクセスしましょう

C言語でのポインタ操作は、NULLの扱いに注意することがバグやクラッシュ防止の第一歩です!