我有一个名为course的结构,每个课程都有多个节点(另一个结构'node')。
它所拥有的节点数量各不相同,但是从我正在读取此信息的文件中获取该数字,因此该数字位于变量中。
所以我需要在struct中使用malloc。但我很困惑。我知道你可以在结构中有数组,但我不知道在哪里放置创建malloc数组的代码,因为我的struct在我的头文件中。这是我目前的代码。我意识到它看起来不对,我只是不知道如何修复它以及在哪里初始化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 :(得分: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);
答案 1 :(得分:3)
malloc(或calloc - 我更喜欢用于结构体)的目的是在运行时动态分配内存。所以,你的结构应该是这样的,因为它是一个对象定义:
struct course {
char identifier[2];
int num_nodes;
struct node *nodes;
};
程序中使用课程结构的其他地方,您需要为您创建的任何课程对象分配内存(i),以及(ii)该课程中的任何节点对象。
e.g。
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);
}
现在,你很好。确保在退出前释放内存。
答案 2 :(得分: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);
}
或按照您喜欢的方式进行操作