2

現在、コードとポインターの理解に問題があります。ここにコードがあります

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

私の理解では、インスタンス struct コマンド *command[2] は、コマンドの配列へのポインターの配列です。したがって、これらを使用して配列を割り当てます。

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

したがって、コマンドの2次元配列が得られます。しかし、私の先生は、struct コマンド *command[2] は配列コマンド サイズ 2 へのポインターであると教えてくれました。したがってcur_command->u.command[0]、サイズ 2 のコマンド配列へのポインターではなく、最初のコマンド要素を指定してください。私の質問は、この種の動作を開発するためにメモリをどのように割り当てることができるかです。どうも

4

1 に答える 1

0

まず、混乱を避けるために、1 つの変数の名前を変更するcmdことをお勧めします。commandあれは:

....
union{
    struct command *cmd[2];
    char **word;
}u;
....

現在、他のいくつかのコメントが指摘しているように、cur_command->u.cmdは への 2 つのポインタの配列ですstruct commandcur_command->u.cmd[0]は 2 つのポインターの最初のものであり、cur_command->u.cmd[1]2 番目のものです。それらのいずれかを使用するには、実際の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(...)ビットが思ったとおりに動作していないことに注意してください。structaをそのような配列として扱うことはできないため、コンパイルする必要があるかどうかは完全にはわかりません...

于 2013-07-02T21:20:53.563 に答える