Waarschuwing: X kan niet-geïnitialiseerd worden gebruikt in deze functie

Ik schrijf een aangepaste “vector”-struct. Ik begrijp niet waarom ik een Warning: "one" may be used uninitializedworden 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%

oneis 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 freenodig 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 *onegebruikt, 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.

Other episodes