NULL - ヌルポインタ定数

NULLはヌルポインタ定数と呼ばれ「整数の0」または「(void*)にキャストした整数の0」として「stddef.h」で定義されています。

ポインタにNULLを代入したものはヌルポインタと呼ばれます。NULLはあらゆるポインタ型に代入できます。

// ヌルポインタ
void* ptr = NULL;
int32_t* int32_ptr = NULL;
float* float_ptr = NULL;

NULLのサンプル

NULLのサンプルです。

メモリ割り当てのチェック

以下のサンプルでは、calloc関数のメモリ割り当てに失敗した場合はNULLが返されます。ですので、メモリが割り当てられていることのチェックに利用できます。

#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
  // ポインタ
  int32_t* nums = calloc(sizeof(int32_t), 10);
  
  // ポインタがNULLではない
  if (nums != NULL) {
    printf("Success\n");
  }
  else {
    printf("Fail\n");
  }
  free(nums);
}

出力結果

Success

木のノードで子要素が存在するか

木のノードで、子要素が存在するかどうかのチェックのサンプルです。

#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

struct myapp_node {
  struct myapp_node* first_child;
  struct myapp_node* last_child;
};

int main(void) {
  
  // 親ノード
  struct myapp_node* parent = calloc(sizeof(struct myapp_node), 1);
  
  // 子ノード
  struct myapp_node* first_child = calloc(sizeof(struct myapp_node), 1);
  
  // 親ノードの最初の子に代入
  parent->first_child = first_child;
  
  if (parent->first_child != NULL) {
    printf("Have First Child\n");
  }

  if (parent->last_child == NULL) {
    printf("Don't Have Last Child\n");
  }
  
  free(parent);
  free(first_child);
}

出力結果

Have First Child

関連情報