不,您不会y->x
两次分配内存。
相反,您正在为结构(包括指针)分配内存以及该指针指向的内容。
这样想:
1 2
+-----+ +------+
y------>| x------>| *x |
| n | +------+
+-----+
因此,您实际上需要两个分配 (1
和2
) 来存储所有内容。
此外,您的类型应该是struct Vector *y
因为它是一个指针,并且您永远不应该从malloc
C 中转换返回值,因为它可以隐藏您不想隐藏的某些问题 - C 完全能够将void*
返回值隐式转换为任何其他指针。
而且,当然,您可能希望封装这些向量的创建,以便更轻松地管理它们,例如:
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);
}
}
通过像这样封装创建,您可以确保向量要么完全构建,要么根本不构建——它们不可能半构建。它还允许您在将来完全更改底层数据结构而不影响客户端(例如,如果您想让它们成为稀疏数组以牺牲空间换取速度)。