Неинициализированный указатель

Указатель не инициализируется прежде чем быть считанным

Описание

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

Примеры

развернуть все

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