2013-10-03 18 views
0

你好,我試圖將一個字符串複製到「word」變量中。 strcpy需要char *類型,而我的「word」變量是char **類型。 我該如何做到這一點? 我試過了,但它不起作用。strcpy:在聯合中使用char **變量作爲參數

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


main(){ 
... 
char* charPtr = "abc"; 
struct command* cmdPtr; 
strcpy(cmdPtr->u.word,charPtr); 
... 
} 
+2

您從分配一些內存開始,因爲其中的未定義行爲非常猖獗。 – WhozCraig

+2

首先,指向'char'的指針不是一個字符串。如果有的話*它可能是一串字符串。其次,在你的代碼片段中,你實際上並沒有初始化結構指針,所以它指向了一些未定義的位置。當你使'cmdPtr'指向某個有效的地方時,你需要初始化結構中的指針*,包括數組中的指針*。 –

+5

你只是想讓程序編譯,還是希望能夠運行? –

回答

4
struct command 
{ 
    ... 
    union 
    { 
     ... 
     char **word;   // <-- requires memory to be associated explicitly 
    } u; 
}; 
... 
char* charPtr = "abc"; 
struct command* cmdPtr;   // <-- uninitialized variable 
strcpy(cmdPtr->u.word,charPtr); // <-- undefined behavior 

cmdPtr未初始化,這意味着該指針的解引用調用一個未定義的行爲已經。即使您爲這個struct分配內存,也必須爲word成員分配內存,否則strcpy會嘗試將字符串複製到無效內存,從而再次產生未定義的行爲。

另外你main的返回值是沒有定義和word聲明爲char**strcpy預計char*類型的第一個參數。例如,你可以這樣做:

struct command cmd; 
char myBuffer[255]; 
char* pBuffer = &myBuffer[0]; 
cmd.u.word = &pBuffer; 
strcpy(*cmd.u.word, "abc"); 
printf("%s", *cmd.u.word); 

或反而讓word指向本地指針:

cmd.u.word = malloc(sizeof(char*)); 
*cmd.u.word = &myBuffer[0]; 

...但一旦你開始動態分配的東西,要小心正確釋放/釋放它以及。

+0

謝謝LihO。是否有可能使用malloc而不是myBuffer [255]? –

+0

@ user1798211:不客氣:) – LihO

相關問題