2014-09-10 101 views
-2

陣列的可用內存我有以下結構:分配和結構

typedef struct 
{ 
    char *name[10]; 
    char *msg[100]; 
} Log; 

我怎樣才能擺脫日誌結構的名稱和味精陣列?我知道free只用於動態分配,動態分配在結構中不起作用。我可以做什麼?

Tryed這一點,但給錯誤:

typedef struct 
{ 
    char *name[] = (char *)malloc(sizeof(char) * 10); 
    char *msg[] = (char *)malloc(sizeof(char) * 100); 
} Log; 

誰能幫我? 謝謝!

+1

您已將此標記爲C++,但代碼肯定是C.您要在哪一個答案? – TartanLlama 2014-09-10 13:54:51

+2

取決於。首先,'char * x []'是一個char-ptr數組。 'char * name [10]'分配10個字符,這不是你想要做的。 'typedef struct {char name [10]; char msg [100];} Log;'將這些字段作爲內聯分配給結構('sizeof(Log)> = 110')。否則,你需要爲結構提供一個init和清理函數。就個人而言,在這種情況下,我只讓用戶與句柄交互,而不直接與結構交互。 – IdeaHat 2014-09-10 14:01:24

+1

'sizeof(char)'是每個定義1的,所以不要寫它。此外,[不要施放malloc(和朋友)]的結果(http://stackoverflow.com/q/605845)。 – Deduplicator 2014-09-10 14:06:11

回答

3

聲明結構不會爲其成員分配內存。內存在創建結構實例時分配。所以

typedef struct 
{ 
    char *name[10]; 
    char *msg[100]; 
} Log; 

不爲namemsg分配內存,它只是聲明Log作爲一個新的數據(用戶定義)的類型。但是當你創建它的一個實例

Log log_flie; 

內存分配給namemsg。現在可以分配存儲器(動態地)對數據成員的元素作爲

for(int i = 0; i < 10; i++) 
    log_file.name[i] = malloc(N); //N is the desired size 

類似地,可以爲msg做。

要釋放動態分配的內存,叫free作爲

for(int i = 0; i < 10; i++) 
    free(log_file.name[i]);  

如果你想爲namemsg分配內存動態然後做如下

typedef struct 
{ 
    char **name; 
    char **msg; 
} Log; 

然後

Log log_file; 
log_file.name = malloc(10 * sizeof(char *)); 
log_file.msg = malloc(100 * sizeof(char *));