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.");
 }

scanf оператор хранит значение в &num. Если значение хранится, законно присвоить &num к num_ptr.

Проверяйте информацию

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