No, estás no la asignación de memoria para y->x
dos veces.
En cambio, está asignando memoria para la estructura (que incluye un puntero) más algo para que apunte ese puntero.
Piénsalo de esta manera:
1 2
+-----+ +------+
y------>| x------>| *x |
| n | +------+
+-----+
Entonces, realmente necesita las dos asignaciones ( 1
y 2
) para almacenar todo.
Además, su tipo debe ser, struct Vector *y
ya que es un puntero, y nunca debe convertir el valor de retorno malloc
en C, ya que puede ocultar ciertos problemas que no desea ocultar: C es perfectamente capaz de convertir implícitamente el void*
valor de retorno a cualquier otro puntero.
Y, por supuesto, probablemente desee encapsular la creación de estos vectores para facilitar su gestión, como con:
struct Vector {
double *data;
size_t size;
};
struct Vector *newVector (size_t sz) {
struct Vector *retVal = malloc (sizeof (struct Vector));
if (retVal == NULL)
return NULL;
retVal->data = malloc (sz * sizeof (double));
if (retVal->data == NULL) {
free (retVal);
return NULL;
}
retVal->size = sz;
return retVal;
}
void delVector (struct Vector *vector) {
if (vector != NULL) {
free (vector->data);
free (vector);
}
}
Al encapsular la creación de esa manera, se asegura de que los vectores estén completamente construidos o no estén construidos en absoluto; no hay posibilidad de que estén a medio construir. También le permite cambiar totalmente las estructuras de datos subyacentes en el futuro sin afectar a los clientes (por ejemplo, si desea hacer arreglos dispersos para intercambiar espacio por velocidad).
malloc()
en C. Nunca entenderé por qué todos sienten la necesidad de hacerlo. :(void *
no se convierte automáticamente a otros punteros, y la conversión es necesaria (o simplemente no se usamalloc()
en C ++, por supuesto).