Ik schrijf een aangepaste “vector”-struct. Ik begrijp niet waarom ik een Warning: "one" may be used uninitialized
worden gebruikt.
Dit is mijn vector.h-bestand
#ifndef VECTOR_H
#define VECTOR_H
typedef struct Vector{
int a;
int b;
int c;
}Vector;
#endif /* VECTOR_ */
De waarschuwing gebeurt hier online 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;
}
Antwoord 1, autoriteit 100%
one
is niet toegewezen, dus wijst naar een onvoorspelbare locatie. Je moet het ofwel op de stapel plaatsen:
Vector one;
one.a = 12;
one.b = 13;
one.c = -11
of wijs er dynamisch geheugen voor toe:
Vector* one = malloc(sizeof(*one))
one->a = 12;
one->b = 13;
one->c = -11
free(one);
Let in dit geval op het gebruik van free
. Over het algemeen heb je precies één oproep naar free
nodig voor elke oproep naar malloc
.
Antwoord 2, autoriteit 33%
Je krijgt de waarschuwing omdat je geen waarde hebt toegekend aan one
, wat een pointer is. Dit is ongedefinieerd gedrag.
Je moet het als volgt declareren:
Vector* one = malloc(sizeof(Vector));
of zoals dit:
Vector one;
in dat geval moet u de operator ->
vervangen door .
als volgt:
one.a = 12;
one.b = 13;
one.c = -11;
Ten slotte kunt u in C99 en later aangewezen initializersgebruiken:
Vector one = {
.a = 12
, .b = 13
, .c = -11
};
Antwoord 3, autoriteit 14%
Als u Vector *one
gebruikt, maakt u alleen een verwijzing naar de structuur, maar er is geen geheugen aan toegewezen.
Gebruik gewoon one = (Vector *)malloc(sizeof(Vector));
om geheugen te declareren en te instantiëren.
Antwoord 4
Dit is misschien niet de meest professionele oplossing, maar in plaats van het te initialiseren met malloc
, kun je het ook initialiseren met new
:
Vector *one = new Vector();
Persoonlijk vind ik het eleganter.