Pointer to non-initialized value converted to const pointer

Указатель на постоянный назначенный адрес, который не содержит значения

Описание

Этот дефект возникает, когда указатель на константу (const int*, const char*, и т.д.) присваивается адрес, который еще не содержит значения.

Риск

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

Зафиксировать

Инициализируйте переменную перед присвоением ее адреса указателю на константу.

Примеры

расширить все

#include<stdio.h>

void Display_Parity()
 {
  int num,parity;
  const int* num_ptr = &num;  
  /* Defect: Address &num does not store a value */

  printf("Enter a number\n:");
  scanf("%d",&num);

  parity=((*num_ptr)%2);
  if(parity==0)
    printf("The number is even.");
  else
    printf("The number is odd.");

 }

num_ptr объявляется как указатель на константу. Однако переменная num не содержит значения, когда num_ptr присваивается адрес &num.

Коррекция - Сохраните значение в адресе перед назначением указателю

Одной из возможных коррекций является получение значения num от пользователя перед &num назначается num_ptr.

#include<stdio.h>

void Display_Parity()
 {
  int num,parity;
  const int* num_ptr;

  printf("Enter a number\n:");
  scanf("%d",&num);

 /* Fix: Assign &num to pointer after it receives a value */ 
  num_ptr=&num;                     
  parity=((*num_ptr)%2);
  if(parity==0)
    printf("The number is even.");
  else
    printf("The number is odd.");
 }

The scanf оператор сохраняет значение в &num. Когда значение сохранено, его законно присвоить &num на num_ptr.

Информация о результатах

Группа: Поток данных
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки: NON_INIT_PTR_CONV
Влияние: Средний
Введенный в R2013b