2012-12-06 2 views
2

나는 코스라는 구조체가 있고 각 코스에는 여러 개의 노드가 있습니다 (다른 구조체 '노드').구조체의 구조체 malloc 배열

노드의 개수는 다양하지만이 정보를 읽는 파일에서 해당 번호가 제공되므로 번호가 변수에 저장됩니다.

그래서 struct 내부에 malloc이 필요합니다. 그러나 나는 혼란 스럽다. 구조체에 배열을 가질 수 있지만 구조체가 내 헤더 파일에 있기 때문에 malloc 배열을 만드는 코드를 어디에 두어야할지 모르겠다. 지금 내 코드가 있습니다. 잘못되었다는 것을 깨달았습니다. malloc 배열을 고칠 수있는 방법과 malloc 배열을 초기화하는 위치를 모르겠습니다.

struct course { 
    char identifier[2]; 
    int num_nodes; 
    struct node *nodes; 
    nodes = (struct nodes*)malloc(num_nodes*sizeof(struct node)); 
}; 

struct node { 
    int number; 
    char type[2]; 
}; 

내가 같은 것을 할 수 있어야합니다 :

나는 많은 C 사용하지 않은 ...

struct node a_node; 
struct course a_course; 

a_course.nodes[0] = a_node; 

등이 내가했습니다 처음 시간 C에서 동적 배열을 사용해 보았습니다. 제 경험은 모두 Java에서 비롯되었으며, 물론 Java는 C와 같은 방식으로 포인터를 사용하지 않으므로 혼란 스럽습니다.

그래서 도움이 많이 주시면 감사하겠습니다, 감사 많은 :

+0

한 가지 방법은 simonc이 그의 대답에서 설명하는 것처럼하는 것입니다.난 그냥 malloc 전화를 넣어 귀하의 질문에 대답하고 싶습니다 : 바로 당신이 메인 구조체에 메모리를 할당 후 바로하십시오. 가짜 :'a = malloc (mother_struct); a-> baby = malloc (baby_struct);':-) – Jite

답변

6

가장 쉬운 방법은 구조체 초기화한다 함수 만드는 것입니다 : 대칭

void init_course(struct course* c, const char* id, int num_nodes) 
{ 
    strncpy(c->identifier, id, sizeof(c->identifier)); 
    c->num_nodes = num_nodes; 
    c->nodes = calloc(num_nodes, sizeof(struct node)); 
} 

, 당신은 또한 다음을 정의 할 수 있습니다 소멸자

void destroy_course(struct course* c) 
{ 
    free(c->nodes); 
} 

등이 것 사용
+0

사용법 예제는 (malloced처럼) 힙이 아닌 스택에 코스 구조체를 배치한다는 점에 유의하십시오. 'init_course' 함수 내부에 할당 된 메모리를 지우라고 제안합니다. – Jite

+0

@Jite 죄송합니다. 따라 가지 않습니다. 'nodes' 멤버가 메모리를 지워야한다는 것을 의미합니까? – simonc

+0

예. 맞습니다. 귀하의 초기 솔루션에서는'malloc'을 사용하고 있었지만 이제는 calloc을 사용하여 트릭을 수행합니다. – Jite

3

malloc (또는 calloc - 구조체에 사용하는 것을 선호)의 목적은 런타임에 동적으로 메모리를 할당하는 것입니다. 코스 구조체를 사용

struct course { 
    char identifier[2]; 
    int num_nodes; 
    struct node *nodes; 
}; 
프로그램의 다른

어딘가에, 사용자가 만든 객체 어떤 코스 메모리 (i)를 할당해야하고 : 객체 정의이기 때문에 그래서, 당신의 구조체는 다음과 같아야합니다 (ii) 그 과정에있는 노드 객체.

main() 
{ 
    // lets say 1 course 
    struct course *my_course; 
    my_course = calloc(1, sizeof(struct course)); 

    // lets say 3 nodes in that course 
    struct node *my_nodes; 
    my_nodes = calloc(3, sizeof(struct node)); 

    my_course.num_nodes = 3; 
    my_course.nodes = my_nodes; 

    //... 
    // clean up 
    free(my_nodes); 
    free(my_course); 
} 

이제는 괜찮습니다. 종료하기 전에 메모리를 비우십시오. 먼저 구조체 선언

: 프로그램

main(){ 
    int i; 
    struct course *c; 
    c = malloc(sizeof(struct course)); 
    c->num_nodes = 3; 
    c->nodes = malloc(sizeof(struct node)*c->num_nodes); 

    for(i=0; i<c->num_nodes; i++) 
     c->nodes[i] = malloc(sizeof(struct node)); 

    //and free them this way 
    for(i=0; i<c->num_nodes; i++) 
     free(c->nodes[i]); 
    free(c->nodes); 
    free(c); 


} 

에서 다음

struct course { 
    char identifier[2]; 
    int num_nodes; 
    struct node *nodes; 
}; 

을 나에게 길을

+0

오타를 만들었습니다 :'struct course * my_course' 여야합니다. – Jite

+0

고정 - Ta : –

1

는 구조체에이 방법을 구조체를 할당 지시 할 수도 있습니다 무엇보다도 당신이 좋아하는 것

+0

여기에는 몇 가지 주요 문제점이 있습니다. 'nodes'는'node *'이지만 관련이없는'struct course'의 크기에 따라 할당합니다. 나중에 노드 배열의 각 요소를 해제하려고합니다. 배열 자체가 할당되었으므로 개별 요소가 할당되지 않으므로 실패합니다. – simonc

+0

네가 맞다면, 바로 잡았습니다. – Neo

+0

감사하지만 변경 사항 중 하나만 적용했습니다. 'free (c-> nodes);를 호출하면된다. - 여전히 각 요소를'c-> nodes' 안에 자유롭게하려고 시도한다. (일반적으로 각 malloc은 정확히 하나의'free'를 요구할 것입니다. 당신의 코드는 현재'malloc'이 1 개 있지만'num_nodes'가'free'를 호출합니다.) – simonc