Как проверить, указывает ли указатель на NULL?

Название может быть немного неправильным... просто потому, что я не уверен, указывает ли мой указатель char на NULL или просто указывает на массив char размером 0.

Итак, у меня есть

char* data = getenv("QUERY_STRING");

И я хочу проверить, являются ли данные нулевыми (или длина < 1). Я пробовал:

if(strlen(data)<1) 

но я получаю сообщение об ошибке:

==24945== Invalid read of size 1
==24945==    at 0x8048BF9: main (in /cpp.cgi)
==24945==  Address 0x1 is not stack'd, malloc'd or (recently) free'd

Я также пробовал

if(data == NULL)

но с тем же результатом.

Что здесь происходит? Я уже пробовал cout с данными, и это работает нормально. Я просто не могу проверить, является ли оно пустым или пустым.

Я понимаю, что это две разные вещи (пустой и пустой). Я хочу знать, какие данные будут здесь, и как проверить, не является ли оно пустым/пустым.

Ответ 1

С getenv вы должны обрабатывать оба случая! (Yay!) Если переменная окружения не установлена, функция возвращает NULL. Если он установлен, вы получаете указатель на его значение, которое может быть пустым. Итак:

const char* data = getenv("QUERY_STRING");
if (data != NULL && data[0] != '\0') {
    // Variable is set to value with length > 0
    // ...
}

Очевидно, вам нужно проверить, если он NULL, прежде чем пытаться определить его длину или прочитать любой из символов, на которые он указывает, - поэтому два условия в приведенном выше if упорядочены так, как они есть.

Ответ 2

Как правило, вы должны проверить что-то вроде этого. Первая часть проверяет указатель на нуль, второй проверяет пустую строку, проверяя первый символ для нулевого терминатора в конце каждой строки.

if (data == NULL || data[0] == 0)

Ваша проблема выглядит как определенное взаимодействие между getenv и strlen, которое не является стандартным.