2016-12-03 8 views
0

내부 구조체의 배열을 자유롭게, cluster_t나는 두 구조체</p> <pre><code>struct obj_t { int id; float x; float y; }; struct cluster_t { int size; int capacity; struct obj_t *obj; }; </code></pre> <p>당신이 볼 수 있듯이이 구조체

내부 첫째 obj_t 포인터는 내부 배열의 모든 obj_t을 무료로 거기에 내가하고 싶은 것은입니다 cluster_t

루프를 for과 같이 써야하나요?

void clear_cluster(struct cluster_t *c) 
{ 
    for(int i = 0; i<c->size;i++) 
    { 
     free(&c->obj[i]); 
    } 
    free(c->obj); 
} 

아니면 이와 같은 메모리를 확보해도됩니까?

void clear_cluster(struct cluster_t *c) 
{ 
    free(c->obj); 
} 
+1

할당 한 순서와 반대입니다. –

+1

* "''obj_t'의 배열이'cluster_t'"안에 있음을 알 수 있습니다. * -'cluster_t' 내부에 배열을 볼 수 없습니다. 나는 포인터를 볼 수 있지만 그것은 다른 것입니다. – axiac

+0

'struct'에 배열에 대한 포인터도 없습니다! – Olaf

답변

3

사용자가 보유한 malloc()마다 free()이 하나 있어야하며 할당 된 순서와 반대 순서로 실행되어야합니다.

objcluster_tobject_t의 배열에 대한 포인터입니다. 이것은 cluster_t (예 : c->obj = malloc(c->capacity*sizeof(*c->obj)))을 초기화 할 때 하나의 malloc()으로 할당되므로 free()으로 한 번만 호출하면됩니다. 그런 다음 (너무 동적으로 할당 된 가정) cluster_t 할당 자체를 해제 할 것 :

free(c->obj); 
free(c); 

있을 것 차이를하지만, 그 자체가 그 안에 동적 할당을했다 object_t합니다. (예에서 object_t은 그렇지 않습니다.)이 경우 배열을 반복 할 때 배열을 만들고 배열을 만들 때 malloc()을 할당해야하므로 역순으로 배열하고 끝에 각각 free()을 할당해야합니다.

+1

@HynekBernard'struct cluster_t'는 멤버'struct obj_t * obj'에 할당 된 메모리가'realloc() '으로 한 번 이상 확장 될 수 있음을 암시하는'int size'와'int capacity' 멤버를 가지고 있습니다. 이는 하나의 할당으로 계산되며 하나만 '자유'가 필요합니다. –

2

할당 방식에 따라 다릅니다. cluster.obj은 단지 배열에 대한 포인터, 당신이 경우

struct cluster_t cluster; 
cluster.obj = malloc(sizeof (struct obj_t) * SOMENUMBER); 

같은 짓을 보인다. 당신이해야 할 모든 c에 대한 포인터를 수신 기능에

free(cluster.obj) 

또는

free(c->obj) 

입니다.

포인터 배열이있는 경우 free을 호출하는 배열을 반복해서 만 반복하면됩니다.

&은 변수의 메모리 주소를 사용합니다. 포인터를 비우지 않으면 포인터가 가리키는 메모리를 확보 할 수 있습니다. free(&pointer)과 같은 일은 결코하지 않을 것입니다.