Как проверить NULL-указатель в C?
У меня есть домашнее задание на C для этого семестра, и учитель сказал, что я должен написать эту функцию не так сложно. Я новичок в программировании, и я не могу найти ответ. Он сказал, что мы делали что-то подобное в классе, но я не мог найти ничего подобного.
int checkforerror(int argc){
if (argc != 3) {
fputs("Too little or too many arguments!\n", stderr);
exit(EXIT_FAILURE);
}
}
Также он указал, что я должен проверить нулевой указатель в функции. Я обнаружил проверку некоторых нулевых указателей в некоторых программах, которые мы написали в классе, но я не уверен, что это хорошо.
int mycmp(char *s1, char *s2){
if (!(s1 && s2))
return EXIT_FAILURE;
Таким образом, мы сделали что-то подобное на уроках. Также я подумал об этом:
if (s1 == NULL && s2 == NULL)
return EXIT_FAILURE;
Я действительно не знаю, являются ли они действительно проверками нулевого указателя и которые я должен использовать.
Можете ли вы помочь мне с этим?
4 ответа
Согласно De_Morgan's_laws
(не (A и B) = не A или не B)
Ваше состояние
if (!(s1 && s2))
такой же как
if (!s1 || !s2)) //same as if (s1 == NULL || s2 == NULL)
Здесь вы проверяете, есть ли s1
или же s2
является NULL
и если да, то вы выходите.
Но во втором
if (s1 == NULL && s2 == NULL)
return EXIT_FAILURE;
если оба s1
а также s2
являются NULL
тогда вы выходите.
Если какой-либо из s1
или же s2
не NULL
вы продолжите и попытаетесь получить к ним доступ, вызывая неопределенное поведение.
Если вы хотите вернуться EXIT_FAILURE
когда любой из указателей NULL
используйте первый вариант, т.е.
if (!(s1 && s2))
return EXIT_FAILURE;
Если вы хотите вернуться EXIT_FAILURE
когда оба указателя NULL
используйте второй вариант, т.е.
if (s1 == NULL && s2 == NULL)
return EXIT_FAILURE;
Фактическая стоимость NULL
определяется реализация. Так что лучше не выполнять логические операции, которые принимают значение NULL
быть определенной ценностью.
Просто, чтобы завершить другие ответы, кажется, вы путаетесь с определением нулевых указателей (и, возможно, указателей вообще).
Кратко пройдя через эти две точки: указатель в C - это переменная, которая указывает на другой "объект". Более конкретно, указатель - это переменная, в которой хранится адрес памяти, в котором у вас есть некоторые другие данные. Проверьте [1] для большего количества примеров. Нулевой указатель в контексте указателей указывает, что переменная-указатель указывает "никуда" [2]. Обычно это используется для определения того, указываете ли вы на некоторые действительные (то есть, не нулевые) или недействительные (то есть, нулевые) данные.
В дополнение к тому, что другие говорили об использовании if (s1 == NULL || s2 == NULL)
Я также хотел бы упомянуть следующую строку, т.е. return EXIT_FAILURE
, Я не уверен, почему ты это делаешь.
EXIT_FAILURE
, а также EXIT_SUCCESS
являются макро константами, обычно используемыми с exit
функция для обозначения неудачи или успеха (соответственно) программы. Возвращать их в функцию, которая выглядит так, будто выполняет сравнение строк, просто не имеет смысла. Вы даже знаете, какова ценность этих констант? EXIT_SUCCESS
может быть ноль, но какова ценность EXIT_FAILURE
Вы должны рассмотреть возможность использования значений, которые действительно имеют смысл для этой функции, т.е.
0
для равных1
еслиs1
больше, чемs2
-1
иначе.