【C言語】NULLとは?使い方や「ヌル文字」,「nullptr」との違いも解説!

C/C++

 こんにちは。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

コメント

タイトルとURLをコピーしました