Non-initialized pointer

Указатель не инициализирован перед чтением

Описание

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

Примеры

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

int assignValueToAddress(int *ptr) {
  *ptr = 0;
}

void main() {
 int* newPtr;
 assignValueToAddress(newPtr);
}

В этом примере newPtr не инициализирован перед передачей в assignValueToAddress().

Коррекция - Инициализируйте указатель перед передачей в функцию

Одной из возможных коррекций является назначение newPtr адрес перед передачей в assignValueToAddress().

int assignValueToAddress(int *ptr) {
  *ptr = 0;
}

void main() {
 int val;
 int* newPtr = &val;
 assignValueToAddress(newPtr);
}
#include <stdlib.h>
#define stackSize 25

typedef struct stackElement {
  int value;
  int *prev;
}stackElement;

int input();

void main() {
 stackElement *stackTop;
 
 for (int count = 0; count < stackSize; count++) {
    if(stackTop!=NULL) {
       stackTop -> value = input();
       stackTop -> prev = (int*)stackTop;
    }
    stackTop = (stackElement*)malloc(sizeof(stackElement));
 }
}

В этом примере, в первом запуске for цикл, stackTop не инициализирован и не указывает на допустимый адрес. Поэтому проверка Non-initialized pointer на stackTop!=NULL возвращает красную ошибку.

Коррекция - Инициализируйте указатель перед разыменованием

Одной из возможных коррекций является инициализация stackTop через malloc() перед проверкой stackTop!=NULL.

#include <stdlib.h>
#define stackSize 25

typedef struct stackElement {
  int value;
  int *prev;
}stackElement;

int input();

void main() {
 stackElement *stackTop;
 
 for (int count = 0; count < stackSize; count++) {
    stackTop = (stackElement*)malloc(sizeof(stackElement));
    if(stackTop!=NULL) {
       stackTop->value = input();
       stackTop->prev = (int*)stackTop;
    }
 }
}
#include <stdio.h>

void main() {
 char *str;
 scanf("%s",str);
}

В этом примере str не указывает на допустимый адрес. Поэтому, когда scanf функция считывает строку из стандартного входа в strпроверка Non-initialized pointer возвращает красную ошибку.

Коррекция - Использование char массив вместо char* указатель

Одной из возможных коррекций является объявление str как char массив. Это объявление присваивает адрес char* указатель, сопоставленный с именем массива str. Затем можно использовать указатель как вход в scanf.

#include <stdio.h>

void main() {
 char str[10];
 scanf("%s",str);
}
#include <stdio.h>

void assignDataBaseElement(char** str) {
 scanf("%s",*str);
}

void main() {
 char *dataBase[20];

 for(int count = 1; count < 20 ; count++) {
    assignDataBaseElement(&dataBase[count]); 
    printf("Database element %d : %s",count,dataBase[count]);
 }
}

В этом примере dataBase является массивом char* указатели. В каждом запуске for цикл, элемент dataBase передается через указатели на функцию assignDataBaseElement(). Переданный элемент не инициализирован и не содержит допустимого адреса. Поэтому, когда элемент используется для хранения строки из стандартного входа, проверка Non-initialized pointer возвращает красную ошибку.

Коррекция - Инициализация char* указатели через calloc

Одной из возможных коррекций является инициализация каждого элемента dataBase через calloc() функция перед передачей ее в assignDataBaseElement(). Инициализация через calloc() позволяет char указатели в dataBase чтобы указать на строки переменного размера.

#include <stdio.h>
#include <stdlib.h>

void assignDataBaseElement(char** str) {
 scanf("%s",*str);
}
int inputSize();

void main() {
 char *dataBase[20];

 for(int count = 1; count < 20 ; count++) {
    dataBase[count] = (char*)calloc(inputSize(),sizeof(char));
    assignDataBaseElement(&dataBase[count]); 
    printf("Database element %d : %s",count,dataBase[count]);
 }
}

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

Группа: Поток данных
Язык: C | C++
Акроним: NIP