こんにちは。Taropouです。今回は、C言語でのNULLとは何か、またNULLの使い方について解説していきます。
NULLとは?
まず、初めにNULLとはなにかについて解説します。C言語ではNULLはヌルポインタと呼ばれており、nullという単語は空白、空というような意味を持ちます。
つまり、NULLは、その名のとおり、中身のない空のポインタ変数を指します。NULLは<stdio.h>で下のように定義されています。
#define NULL ((void *)0) /* 無効なアドレスを示している */
空の状態という概念は他の言語にも存在し、PythonなどはC言語と同じようにnullという言葉を使い、Golangではnilという言葉に置き換えられています。(rubyにもnilがありますが、それはまた異なる意味を持ちます)
また、C++言語では、下のようにNULLは定義されています。
#define NULL 0
0で定義されていますが、NULLを安全に使用し、バグを生まないようにしましょう。
NULLはいつ使う?
NULLを使う例を紹介します。今回は例として、メモリ割り当てのNULLガードを紹介します。
#include <stdio.h>
#include <stdlib.h>/* malloc関数を使うためにインクルード */
int main(int argc, char *argv[])
{
int *a = malloc(sizeof(int));/* C++ではmalloc前に(int*)とキャストが必要 */
if (a == NULL)/* NULLで割り当て失敗を判定 */
{
printf("メモリ割り当て失敗\n");
return 1;
}
*a = 5;
free(a);
return 0;
}
上の例では、NULLを使い、メモリの動的確保の成否を判定しています。NULLは他にも、配列やリストらを操作する場合などにもよく使われます。
’¥0’との違いは?
次にNULLと混同されやすい’\0’との違いについて解説します。こちらはNULLがヌルポインタと呼ばれているのに対して、ヌル文字と呼ばれます。
C言語では文字列の最後にヌル文字が入ります。このように、ヌル文字は文字列関係で使われます。
/* 正しい例 */
if(a[i] == '\0')
{
//処理
}
/* 間違った例 */
if(a[i] == NULL)
{
//処理
}
よく間違われやすいのが上の例のように文字列の終端判定です。コンパイラーによっては’\0’もNULLも同じ値として扱われておりコンパイルが通りますが、本来は文字列の終端判定ではヌル文字を使います。
NULLと’\0’は混同せず、使い方を注意しましょう。
(C++)nullptrとの違いは?
以下はC++の内容を含みます。C言語では使えません。
C++ではnullptrというものもあります。こちらもヌルポインタと呼ばれており、NULLとも互換性があります。
C++ではNULLは0で定義されており、ポインタであることが伝わらないため、nullptrが導入されました。nullptrはNULLに比べて意図が明確なため、最近はNULLからnullptrへの移行が進んでいます。
int a = NULL;/* OK */
int b = nullptr;/* エラー */
int* c = NULL;/* OK */
int* d = nullptr;/* エラー */
ただ、NULLとnullptrにも違いがあり、上のようにnullptrは代入先がポインタ型でないと代入できません。
はじめに書いた通り、nullptrはNULLと混在できます。
まとめ
今回はヌルポインター(NULL)について解説しました。nullptrとの違いなどは、今回改めて調べて、今まで知らなかったことについて知れたのでとてもよかったです。最後まで読んで頂き、ありがとうございました。
Twitterはこちら->https://twitter.com/TaropoProgram
コメント