2013-07-02 118 views
2

當前,我正面臨着我的代碼和對指針的理解問題。這裏的代碼使用指向數組的指針

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])); 

所以它給了我一個二維數組的命令。然而,我的老師告訴我,struct command * command [2]是一個指向數組命令大小2的指針。所以cur_command->u.command[0]給出第一個命令元素,而不是指向命令數組大小2的指針。我的問題是,我如何分配內存來開發這種行爲。 thx

+0

http://cdecl.org對於這樣的事情是非常有用的。基本上你所擁有的是*指針*的大小數組*結構命令 –

+2

你和你的老師都是錯誤的。 'command'是一個包含兩個指向'struct command'的指針的數組。 –

+0

@Carl Norum所以,我不能直接設置cur_command-> u.command [0]的值而不分配內存權限? –

回答

0

首先,我建議改變一個變量的名字,例如cmd而不是command以減少混淆。那就是:

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

現在,作爲一對夫婦的其他評論人士指出,cur_command->u.cmd是兩個指針數組來struct commandcur_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看作是一個這樣的數組......