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 не инициализирован и не указывает на допустимый адрес. Поэтому проверка неинициализированного указателя включена 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, проверка неинициализированного указателя возвращает красную ошибку.

Коррекция - использование 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 loop, элемент dataBase передается через указатели на функцию assignDataBaseElement(). Переданный элемент не инициализирован и не содержит допустимого адреса. Поэтому, когда элемент используется для хранения строки из стандартного ввода, проверка неинициализированного указателя возвращает красную ошибку.

Исправление - инициализация 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