目前,我的代码和对指针的理解都存在问题。 这是代码
struct command
{
int type;
int *input;
int *output;
union{
struct command *command[2];
char **word;
}u;
};
据我了解,实例结构命令 *命令[2] 是一个指向命令数组的指针数组。所以我用这些分配数组:
cur_command->u.command[0] = malloc(sizeof(struct command[2]));
所以它给了我一个 2d 命令数组。但是我的老师告诉我,结构命令 *command[2] 是指向数组命令大小 2 的指针。因此,cur_command->u.command[0]
给出第一个命令元素,而不是指向大小为 2 的命令数组的指针。我的问题是,我如何分配内存来开发这种行为。感谢
首先,我建议将一个变量的名称更改为,例如 cmd
而不是command
以减少混乱。那是:
....
union{
struct command *cmd[2];
char **word;
}u;
....
现在,正如其他几条评论所指出的那样,cur_command->u.cmd
是指向struct command
的两个指针的数组。 cur_command->u.cmd[0]
是两个指针中的第一个,cur_command->u.cmd[1]
是第二个。为了使用它们中的任何一个,它们应该被初始化为指向实际struct command
对象的指针:
cur_command->u.cmd[0] = malloc(sizeof(struct command));
cur_command->u.cmd[1] = malloc(sizeof(struct command));
然后,您可以像使用 cur_command
一样使用其中任何一个,这也是指向 struct command
的指针。也就是说,您可以设置一些字段:
cur_command->u.cmd[0]->type = 1;
....
完成后不要忘记释放内存:
free(cur_command->u.cmd[0]);
free(cur_command->u.cmd[1]);
由于结构是递归的,因此您可能需要一些递归代码来正确释放所有内存,具体取决于将这些东西链接在一起的深度......
另请注意,在您发布的代码 ( malloc(sizeof(struct command[2]))
中,sizeof(...)
位并没有像您认为的那样。我不完全确定它是否应该编译,因为您不能将struct
视为这样的数组......