web-dev-qa-db-fra.com

Avertissement: X peut être utilisé non initialisé dans cette fonction

J'écris une structure "vectorielle" personnalisée. Je ne comprends pas pourquoi je reçois un Warning: "one" may be used uninitialized ici.

Ceci est mon fichier vector.h

#ifndef VECTOR_H
#define VECTOR_H

typedef struct Vector{
    int a;
    int b;
    int c;
}Vector;

#endif /* VECTOR_ */

L'avertissement se produit ici en ligne 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;
}
25
Valentino Ru

one n'a pas été assigné donc pointe vers un emplacement imprévisible. Vous devez soit le placer sur la pile:

Vector one;
one.a = 12;
one.b = 13;
one.c = -11

ou allouer dynamiquement de la mémoire:

Vector* one = malloc(sizeof(*one))
one->a = 12;
one->b = 13;
one->c = -11
free(one);

Notez l'utilisation de free dans ce cas. En général, vous aurez besoin d'un seul appel à free pour chaque appel passé à malloc.

38
simonc

Vous obtenez l'avertissement car vous n'avez pas affecté de valeur à one, qui est un pointeur. Il s'agit d'un comportement indéfini.

Vous devez le déclarer comme ceci:

Vector* one = malloc(sizeof(Vector));

ou comme ça:

Vector one;

auquel cas vous devez remplacer -> opérateur avec . comme ça:

one.a = 12;
one.b = 13;
one.c = -11;

Enfin, en C99 et versions ultérieures, vous pouvez utiliser initialiseurs désignés:

Vector one = {
   .a = 12
,  .b = 13
,  .c = -11
};
17
dasblinkenlight

Lorsque vous utilisez Vector *one, Vous créez simplement un pointeur sur la structure, mais aucune mémoire ne lui est allouée.

Utilisez simplement one = (Vector *)malloc(sizeof(Vector)); pour déclarer la mémoire et l'instancier.

6
plaknas