Почему нельзя сравнивать структуры на NULLness в C? - PullRequest
0 голосов
/ 31 октября 2018

У меня есть следующая структура:

typedef struct School
{
    int numOfStudents;
} School;

Например, если у меня есть структура:

School s;

Я хочу проверить, имеет ли структура значение null, вот так:

if(s) {
    printf("null");
}

Это не скомпилируется и сообщение об ошибке выглядит следующим образом:

error: used struct type value where scalar is required

Почему я не могу проверить структуры на NULLness внутри оператора if в C?

Ответы [ 7 ]

0 голосов
/ 31 октября 2018

NULL используется только указателями. Например, что-то вроде school *s == NULL будет допустимым, поскольку s является указателем на тип school. Однако в вашем случае s не является указателем, поэтому его нельзя сравнить с NULL.

0 голосов
/ 31 октября 2018

Люди выполняют NULL проверки указателей, чтобы определить , является ли указатель действительным . Нам нужно было бы вызвать функцию, чтобы определить, действительно ли struct действителен, и ответ будет зависеть от знания точного содержания и его значения. Например ...

typedef struct
{
    int numOfStudents;
} School;

int null_check(School* item)
{
    /* This test assumes that a School is invalid if it has no students.*/
    return (!item || !item->numOfStudents);
}

/*...*/
School s;
/*...*/
if(null_check(&s)) {
    printf("null");
}

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

0 голосов
/ 31 октября 2018

NULL применяется к типам указателей, а s не является указателем, это экземпляр типа School.

Если вы объявили s как указатель на School, например

School *s;

тогда проверка на ноль будет иметь смысл:

if ( s )
{
  // s points to a valid instance of School
}
0 голосов
/ 31 октября 2018

В случае:

School s;

s определенно не NULL, потому что это не указатель. Однако это неинициализированный экземпляр структуры *1007*, а значение s.numOfStudents не определено.

0 голосов
/ 31 октября 2018

Структура состоит из элементов данных. Каждый элемент может быть нулевым (если это соответствует типу элемента), но сама структура не может быть [по сравнению с] нулевой, даже если она имеет только один элемент данных.

0 голосов
/ 31 октября 2018

NULL - это специальное значение указателя, которое определено, чтобы нигде не указывать. Вы не можете проверить, является ли s NULL, потому что s не указатель.

Если вы хотите узнать, была ли s инициализирована , вы тоже не сможете этого сделать, потому что нет специального значения, которое сообщало бы, что переменная была инициализирована. Например, неинициализированный int может содержать 0, 1, 34634, -265356657 или любое другое значение.

Лучше всего инициализировать переменную известным значением и проверить это.

School s = { -1 };

if (s.numOfStudents == -1) {
    printf("not used yet\n");
}
0 голосов
/ 31 октября 2018

Поскольку null применяется к указателям, а s не является указателем.

Кстати, s - это автоматический объект, который находится в стеке и не может быть нулевым.

...