C: предупреждение: X может использоваться неинициализированным в этой функции
Я пишу пользовательскую "векторную" структуру. Поскольку я очень новичок, я не понимаю, почему я получаю "Warning: "one" may be used uninitialized"
здесь.
Это мой файл vector.h
#ifndef VECTOR_H
#define VECTOR_H
typedef struct Vector{
int a;
int b;
int c;
}Vector;
#endif /* VECTOR_ */
предупреждение появляется здесь в строке one->a = 12
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include "vector.h"
int main(void){
Vector* one;
one->a = 12;
one->b = 13;
one->c = -11;
}
Ответы
Ответ 1
one
не был назначен, поэтому указывает на непредсказуемое местоположение. Вы должны либо поместить его в стек:
Vector one;
one.a = 12;
one.b = 13;
one.c = -11
или динамически выделять для него память:
Vector* one = malloc(sizeof(*one))
one->a = 12;
one->b = 13;
one->c = -11
free(one);
Обратите внимание на использование free
в этом случае. В общем случае вам понадобится ровно один вызов free
для каждого вызова, сделанного в malloc
.
Ответ 2
Вы получите предупреждение, потому что вы не присвоили значение one
, которое является указателем. Это поведение undefined.
Вы должны объявить это следующим образом:
Vector* one = malloc(sizeof(Vector));
или вот так:
Vector one;
в этом случае вам нужно заменить ->
на .
следующим образом:
one.a = 12;
one.b = 13;
one.c = -11;
Наконец, в C99 и более поздних версиях вы можете использовать назначенные инициализаторы:
Vector one = {
.a = 12
, .b = 13
, .c = -11
};
Ответ 3
Когда вы используете Vector *one
, вы просто создаете указатель на структуру, но для него не выделяется память.
Просто используйте one = (Vector *)malloc(sizeof(Vector));
, чтобы объявить память и создать экземпляр.