Два сравнения равенства с NULL в C
Это касается небольшой путаницы в отношении указателей в C++ при сравнении их с NULL. Вот код:
struct node
{
int data;
struct node *left;
struct node *right;
}
int main()
{
struct node *p;
if(p!= NULL)
printf("line1\n");
else
printf("line2\n");
struct node *temp;
if(temp == NULL)
printf("line3\n");
}
Выход:
line2
line3
Пока для следующего куска кода:
struct node
{
int data;
struct node *left;
struct node *right;
}
int main()
{
struct node *p;
if(p!= NULL)
printf("line1\n");
else
printf("line2\n");
struct node *temp;
}
Это вывод:
line1
Кто-нибудь может объяснить, пожалуйста, причину такого происшествия?
4 ответа
auto
переменные (т. е. локальные переменные не объявлены static
) такие как p
а также temp
остаются неинициализированными, поэтому их значение является неопределенным (по существу, любая битовая строка, оставленная в этой конкретной ячейке памяти от предыдущей операции, которая может быть или не быть допустимым значением для данного типа). Никогда не пытайтесь разыменовать неинициализированный указатель.
Переменные, объявленные в области видимости файла (вне любого функционального блока) или с static
Ключевое слово инициализируется следующим образом:
- указатели инициализируются в NULL;
- арифметические типы (целые числа или числа с плавающей запятой) инициализируются в 0
- структуры инициализируются рекурсивно в соответствии с двумя предыдущими правилами
- профсоюзы имеют свой первый именованный член, инициализируемый рекурсивно в соответствии с первыми двумя правилами
Если вы измените декларацию p
в
static struct node *p;
затем p
будет инициализирован в NULL. Если вы не хотите объявлять p
как static
тогда вам придется инициализировать его как часть объявления:
struct node *p = NULL;
Вы объявляете указатель, но не инициализируете его. Может принимать любое значение, т. Е. Не гарантируется NULL
, Конечно, это может быть NULL
(0), но опять же, на это нельзя рассчитывать.
Значение неинициализированной переменной является неопределенным, если оно не имеет статической длительности хранения.
Вы читаете неинициализированную переменную. Это неопределенное поведение. В принципе, все может случиться. Если бы вы включили предупреждения вашего компилятора, компилятор сказал бы вам именно это.
Я подозреваю, что вы считаете, что ваши локальные переменные будут инициализированы автоматически. Это не относится к делу. Вы должны инициализировать их, прежде чем читать их.
Вы должны дать p
драм temp
ценности - так как у вас их нет, они могут содержать что угодно.