Макрос библиотеки C -NULL
Стандартная библиотека C - <stddef.h>
Описание
Макрос библиотеки CNULL— это значение константы нулевого указателя.
NULL— это макрос, который представляет константу нулевого указателя. Обычно он определяется как((void*)0), который представляет нулевой указатель, указывающий на адрес памяти 0.- В C++,
NULLможет быть определён как0или0L, чтобы быть совместимым с целыми числами0Сравните.
Объявление
Ниже приведено зависящее от компилятора объявление макроса NULL.
#define NULL ((char *)0) или #define NULL 0L или #define NULL 0
Параметр
- Н/Д
Возвращаемое значение
- Н/Д
Использование
NULLОн используется для указания, что указатель не указывает ни на какой допустимый объект или адрес. Например, когда динамическое выделение памяти завершается неудачно, обычно возвращается онNULL。NULLОн также используется для инициализации переменных-указателей, указывая, что в данный момент они не указывают ни на какой допустимый адрес.
Пример
В следующем примере демонстрируется использование макроса NULL.
Пример 1
#include <stddef.h>
#include <stdio.h>
int main ()
{
FILE *fp;
fp = fopen("file.txt", "r");
if( fp != NULL )
{
printf("Файл file.txt успешно открыт\n");
fclose(fp);
}
fp = fopen("nofile.txt", "r");
if( fp == NULL )
{
printf("Не удалось открыть файл nofile.txt\n");
}
return(0);
}
#include <stdio.h>
int main ()
{
FILE *fp;
fp = fopen("file.txt", "r");
if( fp != NULL )
{
printf("Файл file.txt успешно открыт\n");
fclose(fp);
}
fp = fopen("nofile.txt", "r");
if( fp == NULL )
{
printf("Не удалось открыть файл nofile.txt\n");
}
return(0);
}
Предположим, файлfile.txtуже существует, ноnofile.txtне существует. Скомпилируем и запустим вышеприведённую программу, которая выдаст следующие результаты:
成功打开文件 file.txt 不能打开文件 nofile.txt
динамическое выделение памяти:
Пример
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = (int*)malloc(sizeof(int) * 10);
if (ptr == NULL) {
printf("Не удалось выделить память\n");
return 1;
}
// Использовать выделенную память
for (int i = 0; i < 10; i++) {
ptr[i] = i;
}
// Освободить выделенную память
free(ptr);
ptr = NULL; // Установить указатель в NULL
return 0;
}
#include <stdlib.h>
int main() {
int *ptr = (int*)malloc(sizeof(int) * 10);
if (ptr == NULL) {
printf("Не удалось выделить память\n");
return 1;
}
// Использовать выделенную память
for (int i = 0; i < 10; i++) {
ptr[i] = i;
}
// Освободить выделенную память
free(ptr);
ptr = NULL; // Установить указатель в NULL
return 0;
}
Параметры функции:
Пример
#include <stdio.h>
#include <string.h>
void printString(const char *str) {
if (str == NULL) {
printf("Строка — NULL\n");
} else {
printf("Строка: %s\n", str);
}
}
int main() {
char *string1 = "Привет, мир!";
char *string2 = NULL;
printString(string1); // Вывод: Строка: Привет, мир!
printString(string2); // Вывод: Строка — NULL
return 0;
}
#include <string.h>
void printString(const char *str) {
if (str == NULL) {
printf("Строка — NULL\n");
} else {
printf("Строка: %s\n", str);
}
}
int main() {
char *string1 = "Привет, мир!";
char *string2 = NULL;
printString(string1); // Вывод: Строка: Привет, мир!
printString(string2); // Вывод: Строка — NULL
return 0;
}
Примечания
NULLЭто стандартный способ представления нулевого указателя, позволяющий избежать прямого использования0или(void*)0, чтобы улучшить читаемость кода и удобство сопровождения.- При сравнении указателей следует использовать
NULL, а не использовать напрямую0。 - В C++ можно использовать
nullptrвместо этогоNULL, чтобы обеспечить более строгую проверку типов.
Связанная информация
- В стандарте C++11 было введено
nullptrключевое слово, как более типобезопасная константа нулевого указателя. NULLОпределение макроса NULL может немного различаться в зависимости от компилятора и реализации стандартной библиотеки, но его смысл и назначение остаются неизменными.