Как проверить 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 иначе.
Другие вопросы по тегам