Указатель не инициализируется прежде чем быть считанным
Эта проверка происходит для каждого чтения указателя. Это определяет, инициализируется ли считанный указатель.
Рассмотрите и зафиксируйте неинициализированные проверки указателя
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; } } }
char*
раньше хранил строку#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); }
char*
раньше хранил строки переменного размера#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 |
Вы щелкнули по ссылке, которая соответствует команде MATLAB:
Выполните эту команду, введя её в командном окне MATLAB.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.