2015-10-10 67 views
-1

我有一個時間赫克搞清楚如何用於在節點字符串數組每個串分配存儲器串的陣列的malloc參數,如下所示:無法確定在節點

typedef struct node { 
    char args[10][20]; 
    struct node *previous; 
    struct node *next; 
} Node; 

Node * createNode(void) { 
    Node *newNode; 
    newNode = malloc(sizeof(Node)); 
    int i; 
    for(i = 0; i < 10; i++) { 
     newNode->args[i] = (char *) malloc(sizeof(char)); 
    } 
    return newNode; 
} 

這會導致以下錯誤:

error: incompatible types when assigning to type ‘char[20]’ from type ‘char *’ 
    newNode->args[i] = (char *) malloc(sizeof(char)); 

類似地,當我試圖malloc(sizeof(char *)),我接收到這樣的錯誤:

error: incompatible types when assigning to type ‘char[20]’ from type ‘char *’ 
    newNode->args[i] = (char *) malloc(sizeof(char *)); 

我以爲我已經開始理解C語言中的指針,但現在我非常困惑。任何幫助將不勝感激。

+3

您不需要爲char [10] [20]分配內存。這意味着你已經有足夠的內存分配給每個大小爲20的10個char數組。 – jayant

+1

在任何情況下'malloc(sizeof(char))'都會分配一個字節的內存。 –

+1

不要在C中投放'malloc'和朋友的結果! – Olaf

回答

0

既然你已經在

char args[10][20] 

分配內存args作爲它重新分配內存時,它拋出一個錯誤。

相反,你可以改變爲:

char **args 

然後使用malloc分配內存:

newNode->args = (char**)malloc(sizeof(*char)*10) 
for(i = 0; i < 10; i++) { 
    newNode->args[i] = (char *) malloc(sizeof(char)*20); 
} 

假設你需要一個尺寸爲20串。

+0

請說明,因爲字符串長度永遠不會在OP的代碼嘗試中。 –

+0

而...爲什麼?如果你真的想要固定大小的字符串,分開分配它們只會浪費資源。 –

+0

順便說一句,你的措辭是不準確的,它努力做到明顯錯誤。在OP的代碼中'char args [10] [20]'不分配任何東西,它聲明瞭一個成員,並在分配包含結構時被分配。重新分配是不被禁止的,但你不能指定一個2d數組的「行」(因爲它不是一個指針),並且通常你不能重新分配一個動態分配對象的* part *。 –

0

想在這裏給出一個答案,有可能是一件事首先澄清:

數組不是的指針。

這是一個很常見的誤解,因爲當作爲函數參數使用時,數組自動地將衰減爲,並且它可以隱式轉換爲指針。它仍然不一樣。

因此,看看你的結構。在那裏你沒有任何指向char的指針。這裏還有沒有必要爲args分配什麼,因爲你已經struct node包括成員args10 * 20字節的空間。