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