いいえ、あなたはしていないためにメモリを割り当てるy->x
二回。
代わりに、あなたは(ポインタを含む)構造のためのメモリ割り当てているプラスポイントにまでそのポインタのために何かを。
このように考えてください:
1 2
+-----+ +------+
y------>| x------>| *x |
| n | +------+
+-----+
したがって、実際には、すべてを格納するために2つの割り当て(1
および2
)が必要です。
さらに、型はstruct Vector *y
ポインターである必要がありmalloc
、Cで戻り値をキャストしないでください。隠したくない特定の問題を隠すことができるため、Cはvoid*
戻り値を他のポインターに暗黙的に変換することができます。
そしてもちろん、次のように、これらのベクトルの作成をカプセル化して、それらの管理を容易にすることをお勧めします。
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);
}
}
このように作成をカプセル化することで、ベクターが完全に構築されているか、まったく構築されていないかを確認できます。ベクトルが半分構築される可能性はありません。また、将来、クライアントに影響を与えることなく、基になるデータ構造を完全に変更することもできます(たとえば、スペースと速度のトレードオフのためにクライアントをスパース配列にしたい場合)。
malloc()
、Cの戻り値をキャストしないでください。なぜ誰もがそうする必要があると感じるのか理解できません。:(