Non, tu es no l'allocation de la mémoire pour y->x
deux fois.
Au lieu de cela, vous allouez de la mémoire pour la structure (qui inclut un pointeur) plus quelque chose vers lequel ce pointeur doit pointer.
Pensez-y de cette façon :
1 2
+-----+ +------+
y------>| x------>| *x |
| n | +------+
+-----+
Vous avez donc besoin des deux allocations ( 1
y 2
) pour tout stocker.
En outre, votre type doit être struct Vector *y
puisqu'il s'agit d'un pointeur, et vous ne devriez jamais transférer la valeur de retour de malloc
en C, car il peut cacher certains problèmes que vous ne voulez pas voir cachés - le C est parfaitement capable de convertir implicitement l'adresse IP de l'utilisateur en une adresse IP. void*
la valeur de retour à tout autre pointeur.
Et, bien sûr, vous souhaitez probablement encapsuler la création de ces vecteurs pour en faciliter la gestion, comme avec :
struct Vector {
double *data; // no place for x and n in readable code :-)
size_t size;
};
struct Vector *newVector (size_t sz) {
// Try to allocate vector structure.
struct Vector *retVal = malloc (sizeof (struct Vector));
if (retVal == NULL)
return NULL;
// Try to allocate vector data, free structure if fail.
retVal->data = malloc (sz * sizeof (double));
if (retVal->data == NULL) {
free (retVal);
return NULL;
}
// Set size and return.
retVal->size = sz;
return retVal;
}
void delVector (struct Vector *vector) {
// Can safely assume vector is NULL or fully built.
if (vector != NULL) {
free (vector->data);
free (vector);
}
}
En encapsulant la création de cette manière, vous vous assurez que les vecteurs sont soit entièrement construits, soit pas construits du tout - il n'y a aucune chance qu'ils soient à moitié construits. Cela vous permet également de modifier totalement les structures de données sous-jacentes à l'avenir sans affecter les clients (par exemple, si vous vouliez en faire des tableaux épars pour troquer l'espace contre la vitesse).