2

我有一个名为 course 的结构,每个课程都有多个节点(另一个结构“节点”)。

它具有的节点数各不相同,但我从一个文件中获得了该数字,我从中读取此信息,因此该数字位于一个变量中。

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

ETC...

我用的C不多,这是我一次尝试在C中使用动态数组。我的经验都来自Java,当然Java并没有真正像C一样使用指针,所以这就是全部对我来说有点困惑。

所以一些帮助将不胜感激,非常感谢:)

4

3 回答 3

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);
于 2012-12-06T15:28:23.137 回答
3

malloc(或 calloc - 我更喜欢用于结构)的目的是在运行时动态分配内存。所以,你的结构应该是这样的,因为它是一个对象定义:

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

在您的程序中使用 course 结构的其他地方,您将需要为您创建的任何课程对象和 (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);
}

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

于 2012-12-06T16:07:51.223 回答
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);


}

或者按照你喜欢的方式去做

于 2012-12-06T19:41:46.220 回答