
【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の扱いに注意することがバグやクラッシュ防止の第一歩です!
