2012-12-06 72 views
2

我有一个叫做course的结构体,每个课程都有多个节点(另一个struct'node')。malloc struct struct中的结构体数组

它具有的节点数量会有所不同,但我从正在读取此信息的文件中获得该编号,以便该编号位于变量中。

所以我需要一个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]; 
}; 

我希望能够做一些事情,如:

struct node a_node; 
struct course a_course; 

a_course.nodes[0] = a_node; 

等等

我没有用太多C,这是第一一次,我曾经尝试在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); 
} 

这些本来使用像

struct course c; 
init_course(&c, "AA", 5); 
/* do stuff with c */ 
destroy_course(&c); 
+0

请注意,使用示例将课程结构放置在堆栈上,而不是堆(如果是malloced)。我建议你清除'init_course'函数内部分配的内存。 – Jite

+0

@Jite对不起,我没有关注。你的意思是'节点'成员应该清除内存吗? – 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); 
} 

现在,你很好。确保在退出之前释放内存。

+0

你犯了一个错字:它应该是'struct course * my_course'。 – Jite

+0

修复它 - 钽:) –

1

,也可以直接通过这种方式分配结构的结构:

首先声明你的结构:

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

然后在你的程序

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); 


} 

或做它的方式以上任何你喜欢的东西

+0

这里有几个主要问题。 'nodes'是一个'node *',但是你根据不相关的'struct course'的大小来分配它。您稍后尝试释放'nodes'数组中的每个元素 - 由于数组本身已分配,这将失败,而不是其各个元素。 – simonc

+0

是的你是正确的,我纠正它。 – Neo

+0

谢谢你,但你只应用其中的一个变化。你只需要调用'free(c-> nodes);' - 你仍然试图释放'c-> nodes'中的每个元素。 (一般来说,每个'malloc'都需要一个'free'',你的代码目前有'malloc'',但'num_nodes'''''''' – simonc