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

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

Описание

Указатель на не инициализированное значение, преобразованное в указатель 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++
Значение по умолчанию: 'off'
Синтаксис командной строки: NON_INIT_PTR_CONV
Влияние: носитель

Введенный в R2013b