目前,我遇到了我的代码问题以及对指针的理解。这是代码
struct command
{
int type;
int *input;
int *output;
union{
struct command *command[2];
char **word;
}u;
};
根据我的理解,实例struct command * command [2]是一个指向数组命令的指针数组。所以我用这些分配数组:
cur_command->u.command[0] = malloc(sizeof(struct command[2]));
所以它给了我一个2d的命令数组。但是我的老师告诉我struct command * command [2]是一个指向数组命令大小2的指针。所以cur_command->u.command[0]
给出了第一个命令元素,而不是指向命令数组大小为2的指针。我的问题是,如何分配内存来开发这种行为。 THX
答案 0 :(得分:0)
首先,我建议将一个变量的名称更改为,例如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
位未执行您认为的操作。我不完全确定它应该编译,因为你不能将{{1}}视为一个像这样的数组......