使用指向数组的指针

时间:2013-07-02 20:32:38

标签: c malloc

目前,我遇到了我的代码问题以及对指针的理解。这是代码

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

1 个答案:

答案 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}}视为一个像这样的数组......