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;
}
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
.
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
};
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.