Как проверить, указывает ли указатель на 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
, которое не является стандартным.