NULL
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <stddef.h>
|
||
| Определено в заголовочном файле <string.h>
|
||
| Определено в заголовочном файле <wchar.h>
|
||
| Определено в заголовочном файле <time.h>
|
||
| Определено в заголовочном файле <locale.h>
|
||
| Определено в заголовочном файле <stdio.h>
|
||
| Определено в заголовочном файле <stdlib.h>
|
||
#define NULL /*определяется реализацией*/ |
||
Макрос NULL это определяемая реализацией константа нулевого указателя, которая может быть
- целым константным выражением со значением
0 - целым константным выражением со значением 0, приведённым к типу
void*
|
(начиная с C23) |
Константа нулевого указателя может быть преобразована к указателю на любой тип; такое преобразование приводит к значению нулевого указателя этого типа.
Возможная реализация
// совместимая с C++:
#define NULL 0
// несовместимая с C++:
#define NULL (10*2 - 20)
#define NULL ((void*)0)
// начиная с C23 (совместимо с C++11 и более поздними)
#define NULL nullptr
|
Пример
Запустить этот код
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main(void)
{
// любой указатель может быть установлен в NULL
int* p = NULL;
struct S *s = NULL;
void(*f)(int, double) = NULL;
printf("%p %p %p\n", (void*)p, (void*)s, (void*)(long)f);
// многие функции, возвращающие указатель, используют нулевой указатель для индикации ошибки
char *ptr = malloc(0xFULL);
if (ptr == NULL)
printf("Out of memory");
else
printf("ptr = %#" PRIxPTR"\n", (uintptr_t)ptr);
free(ptr);
}
Возможный вывод:
(nil) (nil) (nil)
ptr = 0xc001cafe
См. также
(C23) |
тип предопределённой константы — нулевого указателя nullptr (определение типа) |
Документация C++ по NULL
| |