2

目前,我的代码和对指针的理解存在问题。这是代码

struct command
{
    int type;
    int *input;
    int *output;
    union{
        struct command *command[2];
        char **word;
    }u;
 };

据我了解,实例结构命令 *command[2] 是一个指向命令数组的指针数组。所以我用这些分配数组:

cur_command->u.command[0] = malloc(sizeof(struct command[2]));

所以它给了我一个二维命令数组。但是我的老师告诉我 struct command *command[2] 是一个指向数组命令大小为 2 的指针。所以cur_command->u.command[0]给出第一个命令元素而不是指向命令数组大小为 2 的指针。我的问题是,我怎样才能分配内存来发展这种行为。谢谢

4

1 回答 1

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(...)位并未按照您的想法进行。我不完全确定它是否应该编译,因为您不能将 astruct视为那样的数组......

于 2013-07-02T21:20:53.563 回答