Проверка, равен ли указатель файла NULL в C, указатель или переменная - PullRequest
0 голосов
/ 02 мая 2020

У меня есть соответствующий вопрос, который подчеркивает мое слабое понимание того, как работать с указателями. Я объявляю переменную-указатель с именем

FILE *MEMORY_CARD = fopen("card.raw", "r")

В моем понимании, я только что объявил указатель с именем MEMORY_CARD, который содержит информацию из файла с именем card.raw. Хорошо, теперь я хотел бы проверить, является ли этот указатель NULL.

Должен ли я сделать это так:

if (MEMORY_CARD == NULL)

{
    exit(1);
}

Или вот так:

if (*MEMORY_CARD == NULL)
{
    exit(1);
}

Кажется, что первый случай верен, потому что я видел, как он это сделал Кстати, но исходя из моего текущего понимания, я подумал, что вам нужно будет сделать это в соответствии с нижним путем. Это потому, что я подумал, что каждый раз, когда вы хотите проверить значение по адресу, на который указывает указатель, вы должны использовать оператор разыменования, так что * MEMORY_CARD - это ссылка на информацию в этом месте, то, что вы хотите проверить на ноль. Я бы подумал, что верхний путь был бы неверен, так как он спрашивает: «Проверьте, не находится ли внутри переменной MEMORY_CARD значение NULL (которое я никогда не объявлял. Я объявил указатель с именем * MEMORY_CARD). Переменная будет выглядеть как int i = 1, где Я не использую указатель.

Я испытываю ту же путаницу, когда мне нужно проверить, является ли то, что я объявляю с помощью mallo c, значением Null. Я ссылаюсь на него с * префиксом имени или просто ссылаться на него как на переменную. Возможно, я все еще путаюсь с базовым определением указателя против переменной. Надеюсь, что эти примеры проливают свет на более широкую концепцию изображения, что я немного туманен. Я посмотрел на Я немного ресурсов, но они, кажется, не достаточно глубоко погрузились в мелочи этого. Надеюсь, кто-то может помочь мне разобраться в этом. Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

Это потому, что я подумал, что каждый раз, когда вы хотите проверить значение по адресу, на который указывает указатель, вам нужно использовать оператор разыменования

Это верно, но не применяется. Нет необходимости «проверять значение по адресу», только адрес.

Правильная проверка ниже проверяет указатель.

if (MEMORY_CARD == NULL)
{
    exit(1);
}
0 голосов
/ 02 мая 2020

MEMORY_CARD - это адрес вашего открытого файла в памяти
*MEMORY_CARD - это данные самой вашей файловой структуры
, поэтому вы должны проверить MEMORY_CARD

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...