Перейти к содержимому

Использование неинициализированной памяти c как исправить

  • автор:

Предупреждение C6001

Использование неинициализированной памяти «переменная«.

Замечания

Это предупреждение сообщается, когда неинициализированная локальная переменная используется перед назначением значения. Это использование может привести к непредсказуемым результатам. Перед использованием всегда следует инициализировать переменные.

Имя анализа кода: USING_UNINIT_VAR

Пример

Следующий код создает это предупреждение, так как переменная i инициализирована только в том случае, если b имеет значение true:

int f( bool b ) < int i; if ( b ) < i = 0; >return i; // i is uninitialized if b is false > 

Чтобы исправить это предупреждение, инициализировать переменную, как показано в следующем коде:

int f( bool b ) < int i = -1; if ( b ) < i = 0; >return i; > 

Эвристика

В следующем примере показано, что передача переменной в функцию по ссылке приводит к тому, что компилятор предполагает, что он инициализирован:

void init( int& i ); int f( bool b ) < int i; init(i); if ( b ) < i = 0; >return i; // i is assumed to be initialized because it's passed by reference to init() > 

Это поддерживает шаблон передачи указателя на переменную в функцию инициализации.

Эта эвристика может привести к ложным отрицательным значениям, так как многие функции ожидают указателей, указывающих на инициализированные данные. Используйте заметки SAL, такие как _In_ и _Out_ , чтобы описать поведение функции. В следующем примере вызывается функция, которая ожидает инициализации его аргумента, поэтому создается предупреждение:

void use( _In_ int& i ); int f( bool b ) < int i; use(i); // uninitialized variable warning because of the _In_ annotation on use() if ( b ) < i = 0; >return i; > 

c++ калькулятор

При отладке выводит «Использование неинициализированной памяти», как решить сею проблему?

#include using namespace std; int main(int argc, const char* argv[]) < float a, b, c; char d; int q; cout Launch Calculator \n 2 => Complete programm \n" > q; if (q == 1) < cout > "; cin >> a; cout > b; cout else if (d == '-') < c = a - b; cout else if (d == '*') < c = a * b; cout else if (d == '/') < c = a / b; cout catch (int x) < cout > divide by 0!" > else if (q == 2) cout > 

Отслеживать

13.7k 12 12 золотых знаков 43 43 серебряных знака 75 75 бронзовых знаков

задан 5 янв 2022 в 15:33

bonus_____ bonus_____

33 6 6 бронзовых знаков

Использование неинициализированной памяти

Использование неинициализированной памяти — это чтение данных из буфера, который был выделен, но не заполнен начальными значениями. Такое поведение программы является ошибкой, которую иногда трудно выявить. Это так называемая «плавающая ошибка». Проявление ошибки может зависеть от версии компилятора или операционной системы, а так же от запуска «отладочной» или «релиз» версии.

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

Рассмотрим пример такой ошибки:

dgCollisionCompoundBreakable::dgCollisionCompoundBreakable(. )

Ошибка заключается в неполной инициализации массива ‘mainSegmenst’. Этот код будет работать корректно в 32-битной программе, где размер указателя совпадает с размером типа ‘int’. И перестанет в 64-битной программе.

Библиографический список

  • Wikipedia. Uninitialized variable.
  • Терминология. Неинициализированная переменная.

Использование неинициализированной памяти

Делаю простую программку на С++: нужно вывести, сколько в месяце дней, в зависитимости от его порядкового номера, но нужно учесть то, что год может быть високосным или не високосным (вводим с клавы). Ошибка на скрине и в самой теме вопроса (подчёркивает переменную b).

Лучший ответ

#include
using namespace std;
class Yaer public:
Yaer() : year(1900) <>
Yaer(int year) : year(year) <>
int days(int month) if (month < 1 || month >12) return -1;
if (month == 2 && is_leap()) return 29;
return box[month];
>
private:
int year;
inline static const int box[] = < 365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 >;
bool is_leap() bool result;
if (year % 4 != 0) result = false;
else if (0 == year % 400) result = true;
else if (0 == year % 100) result = false;
else result = true;
return result;
>
>;
int integer(const char* msg) cout int value;
cin >> value;
cin.ignore(cin.rdbuf()->in_avail());
return value;
>
int main() system(«chcp 1251 > nul»);
while (true) auto year = integer(«Введите год: «);
auto month = integer(«Введите номер месяца: «);
Yaer date(year);
auto days = date.days(month);
if (days > 0) cout else puts(«Месяца с таким номером не существует!»);
puts(«»);
>
>

Остальные ответы

После int b; должен быть cin >> b;

Но вообще есть формулы вычисления дней в месяце заданного года.

dfdg dgfghУченик (92) 2 года назад
dfdg dgfghУченик (92) 2 года назад

дело в том, что нужно использовать именно switch, так как это было обязательно, потому что так написано в методичке

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *