Подтвердить что ты не робот

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;
}
4b9b3361

Ответ 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));, чтобы объявить память и создать экземпляр.