아니요, 메모리를 두 번 할당 하지 않습니다y->x
.
대신 (포인터 포함) 구조에 대한 메모리를 할당하고 플러스 를 차례로 그 포인터를 위해 무언가를.
다음과 같이 생각하십시오.
1 2
+-----+ +------+
y------>| x------>| *x |
| n | +------+
+-----+
따라서 실제로 모든 것을 저장 하려면 두 개의 할당 ( 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에서 의 반환 값을 캐스팅하지 마십시오 . 왜 모든 사람이 그렇게해야한다고 느끼는지 이해하지 못할 것입니다. :(