exponenta event banner

Указатель на неинициализированное значение преобразован в указатель const

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

Описание

Этот дефект возникает, когда указатель на константу (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.");
 }

scanf инструкция сохраняет значение в &num. После сохранения значения его можно присвоить &num кому num_ptr.

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

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