FILE *p
является указателем и имеет смысл сравнить его со значением NULL. С другой стороны,
struct foo bar = {0};
if (bar == NULL)
не имеет смысла (по крайней мере, тот, который вам нужен), и не имеет ничего общего с &bar == NULL
; последний будет работать, но всегда будет ложным, так как память struct foo bar = {0}
точно существует. Так что на самом деле не существует способа, как может произойти сбой для struct foo bar;
: память «правильно распределена» или программа дает сбой другим способом.
struct foo *bar;
bar = malloc(sizeof(struct foo));
if ( bar == NULL ) // ...
говорит, что bar является указателем (и мы пытаемся распределить необходимую память для хранения struct foo), поэтому bar == NULL
в порядке.
Вы можете сказать что-то вроде FILE p
, которое отличается от FILE *p
(и не рекомендуется, FILE *
должен рассматриваться как "непрозрачный" указатель, который вас не должен интересовать, поскольку он может отличаться в разных реализациях )
Добавить после прочтения комментария автора вопроса
FILE *cfPtr;
if ( ( cfPtr = fopen( "file.dat", "w" ) ) == NULL )
Это работает, так как сначала оценивается left inner (), и поэтому cfPtr присваивается результату fopen, как если бы это был единственный statemente cfPtr = fopen(...)
. После этого этот же результат (значение cfPtr) сравнивается с NULL. fopen
возвращает, конечно, FILE *
, и указатель можно сравнить с NULL.