@Voyager01

Как убрать предупреждение «F может быть равно NULL»?

Есть предупреждение, которое у меня не получается убрать
Пробовал по си-шной документации делать, ничего не получилось.

#include <stdio.h>
#include <windows.h>
#include <locale.h>
#include <stdlib.h>

struct list
{
   list* next = NULL;
   int elem = 0;
} *l = new list;

bool input(list* l)
{
   FILE* F;
   int t = 0;
   list* c = l;
   fopen_s(&F, "ttt.txt", "r");
   if (F)
   {
      for (; fscanf_s(F, "%d", &t) != EOF;)
      {
         c->next = new list;
         c = c->next;
         c->elem = t;
      }
      fclose(F);
      return true;
   }
   else
      return false;

}

int sum(list* l)
{
   int sum = 0;
   list* c = l;
   for (; c->next->next != NULL; c = c->next);
   sum = c->elem + c->next->elem;
   return sum;
}

void output(list* l)
{
   list* c = l;
   FILE* F = NULL;
   fopen_s(&F, "out1.txt", "w");
   fprintf(F, "%d", sum(l));
   fclose(F);
   for (c = c->next; c; c = c->next)
      printf_s("%d ", c->elem);
   printf_s("\n");
}

int main()
{
   setlocale(0, "");
   UINT cp = GetConsoleCP(), outcp = GetConsoleOutputCP();
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);
   l->next = NULL;
   if (input(l))
      if (l->next)
      {
         printf_s("список: ");
         output(l);
         printf_s("Сумма двух последних элементов списка: %d", sum(l));
      }
      else
         printf_s("Список пуст");
   else
      printf_s("Не удалось открыть файл");
   SetConsoleCP(cp);
   SetConsoleOutputCP(outcp);
}


Есть варианты как можно избавится от этого предупреждения??
  • Вопрос задан
  • 92 просмотра
Решения вопроса 1
TrueBers
@TrueBers
Гуглю за еду
Как минимум, не мешать Си и Си++, а писать на чём-то одном, и различать их.
Во-вторых, зачем от предупреждения избавляться? Его нужно понять, почему оно появляется. Когда будет понимание, тогда всё станет на свои места.

Достаточно предположить, что функция fopen_s внезапно не сможет открыть файл и вернёт ошибку. Допустим, файла не существует, или на его открытие нет прав у пользователя. Ты же не проверяешь возврат результата из функции открытия и пытаешься что-то записать в F, даже если функция не смогла открыть файл и вернула ошибку. А когда она вернёт её, переменная F останется нулевыем указателем или, в первом твоём случае, вообще будет обращение к неинициализированной переменной, где ты получишь неопределённое поведение. Вот оно и ругается на эту ветку развития событий.

Добавь проверки на возвращаемые значения функций, и предупреждение пропадёт.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
--  FILE* F = NULL;
--  fopen_s(&F, "out1.txt", "w");
++  FILE * F;
++  errno_t err;
++  err = fopen_s(&F, "out1.txt", "w");
++  if (err != 0) {
++      printf_s("Ошибка создания файла 'out1.txt': %d\n", err);
++      return;
++  }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы