2017-12-01 28 views
0

동적 배열 객체를 사용하여 클러스터를 만들려고합니다.C - 구조체 내에서 동적 배열에 액세스

구조체의 정의는 다음과 같다 : 클러스터에 객체를 추가하기위한

struct obj_t { 
    int id; 
    float x; 
    float y; 
}; 

struct cluster_t { 
    int size; 
    int capacity; 
    struct obj_t *obj; 
}; 

함수이다

void append_cluster(struct cluster_t *c, struct obj_t obj) 
{ 
    if(c->capacity < (c->size + 1)) 
    { 
     c = resize_cluster(c, c->size + 1); 
    } 
    if(c == NULL) 
     return; 
    c->obj[c->size] = obj; //at this point program crashes. 
    c->size++; 
} 

EDIT : 여기 resize_cluster는() 함수 :

struct cluster_t *resize_cluster(struct cluster_t *c, int new_cap) 
{ 
    if (c->capacity >= new_cap) 
     return c; 

    size_t size = sizeof(struct obj_t) * new_cap; 

    void *arr = realloc(c->obj, size); 
    if (arr == NULL) 
     return NULL; 

    c->obj = (struct obj_t*)arr; 
    c->capacity = new_cap; 
    return c; 
} 

EDIT 2 : 다음은 클러스터 초기화입니다.

void init_cluster(struct cluster_t *c, int cap) 
{ 
    c = malloc(sizeof(struct cluster_t)); 
    c->size = 0; 
    c->capacity = cap; 
    c->obj = (struct obj_t*)malloc(cap * sizeof(struct obj_t)); 
} 

클러스터의 배열에 개체를 추가하려고 할 때 프로그램이 충돌하는 이유를 알 수 없습니다. 배열에 이런 식으로 액세스하는 것이 잘못 되었습니까? 그렇다면 어떻게 접근해야합니까?

+1

우리가 (see'resize_cluster 수)'? –

+2

어떻게 cluster_t를 초기화합니까? – EdmCoff

+0

디버깅 도움말을 찾는 질문 ("이 코드가 작동하지 않는 이유는 무엇입니까?")에는 원하는 동작, 특정 문제 또는 오류 및 질문 자체에서이를 재현하는 데 필요한 가장 짧은 코드가 포함되어야합니다. 분명한 문제 성명이없는 질문은 다른 독자에게 유용하지 않습니다. 참조 : [mcve]를 만드는 방법. – AndyG

답변

3

문제는 init_cluster()입니다. c 매개 변수에 의해-가치 전달됩니다, 그래서 당신이 보내는 어떤 수정되지 않은 남아 :

struct cluster_t * c; 
init_cluster(c, 1); 
// c is uninitialized! 

한 수정 객체에 대한 포인터를 전달하는 것입니다 :

struct cluster_t c; 
init_cluster(&c, 1); 

그런 init_cluster()에서 c = malloc(sizeof(struct cluster_t));를 제거;

또는 당신이 alloc_cluster 기능을 만들 수 있습니다

struct cluster_t * alloc_cluster(int cap) 
{ 
    c = malloc(sizeof(struct cluster_t)); 
    c->size = 0; 
    c->capacity = cap; 
    c->obj = malloc(cap * sizeof(struct obj_t)); 
    return c; 
} 

과 같이 호출 :

struct cluster_t *c = init_cluster(1); 
+0

'c = malloc (sizeof (struct cluster_t));을'init_cluster()'에서 삭제하면 원했던대로 작동합니다. 고마워. – user3670471