Không, bạn không phân bổ bộ nhớ cho y->x
hai lần.
Thay vào đó, bạn đang phân bổ bộ nhớ cho cấu trúc (bao gồm một con trỏ) cộng với một thứ gì đó để con trỏ trỏ tới.
Nghĩ theo cách này:
1 2
+-----+ +------+
y------>| x------>| *x |
| n | +------+
+-----+
Vì vậy, bạn thực sự cần hai phân bổ ( 1
và 2
) để lưu trữ mọi thứ.
Ngoài ra, kiểu của bạn nên là struct Vector *y
vì nó là một con trỏ và bạn không bao giờ nên chuyển giá trị trả về từ malloc
trong C vì nó có thể ẩn một số vấn đề nhất định mà bạn không muốn ẩn - C hoàn toàn có khả năng chuyển đổi ngầm void*
giá trị trả về sang bất kỳ con trỏ nào khác.
Và, tất nhiên, bạn có thể muốn gói gọn việc tạo các vectơ này để giúp quản lý chúng dễ dàng hơn, chẳng hạn như với:
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);
}
}
Bằng cách đóng gói việc tạo ra như vậy, bạn đảm bảo rằng các vectơ hoặc được tạo hoàn chỉnh hoặc không được xây dựng hoàn toàn - không có khả năng chúng được tạo một nửa. Nó cũng cho phép bạn thay đổi hoàn toàn các cấu trúc dữ liệu cơ bản trong tương lai mà không ảnh hưởng đến các máy khách (ví dụ: nếu bạn muốn làm cho chúng thành các mảng thưa thớt để đánh đổi không gian lấy tốc độ).
malloc()
bằng C. Tôi sẽ không bao giờ hiểu tại sao mọi người lại cảm thấy cần phải làm như vậy. :(