exponenta event banner

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

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

Описание

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

Примеры

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

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