2017-09-05 57 views
-2

我正在編寫一個init函數來初始化鏈表中的第一個節點。我試圖添加一個字符串名稱來標記每個節點,但當函數返回時出現奇怪的行爲。我將字符串直接傳遞給函數,mallocing另一個相同長度的char *,然後將輸入字符串strcpy到這個新位置。我試圖將它存儲在結構中的char **中。它在init函數內複製到結構中,但一旦它返回字符串更改,就像內存在返回init函數時釋放一樣。將字符串傳遞給init函數並將其存儲在malloc'd struct

typedef struct { 
    key_grid_TypeDef* grid; 

    char** name; 
    uint8_t ID; 

    void* next; 
    void* prev; 
} keymap_layer; 

keymap_err_TypeDef keymap_init(keymap_list* layer_list, 
    key_grid_TypeDef* grid, char* layer_name){ 

//init initial layer 
    keymap_layer *layer = (keymap_layer*) malloc (sizeof(keymap_layer)); 
    if (layer == NULL) 
     return km_init_err; 

    char* mal_name = (char*) 
    malloc((strlen(layer_name)+1)*sizeof(char)); 
    if (mal_name == NULL) 
     return km_init_err; 
    strcpy(mal_name,layer_name); 
    layer->name = &mal_name; 

    if(sizeof(keymap0) == sizeof(*layer->grid)) 
     memcpy(&layer->grid, &grid, KEYBOARD_ROWS * KEYBOARD_COLS); 
    else{ 
     free(layer); 
     return km_init_err; 
} 

return km_ok;} 
在我的任務

ret = keymap_init(&key_layer_list, &keymap0, "Initial layer"); 

感謝

+1

「我試圖將它存儲在結構中的char **中 - 爲什麼? – molbdnilo

+1

請正確格式化您的代碼片段,並在發佈 –

+0

@molbdnilo之前提供所有有用的相關定義,以便我可以更輕鬆地更改它指向未來的字符串。 –

回答

0

這是非常可疑:

char* mal_name = (char*) malloc((strlen(layer_name)+1)*sizeof(char)); 
if (mal_name == NULL) 
    return km_init_err; 
strcpy(mal_name,layer_name); 
layer->name = &mal_name; 

局部變量mal_name不再爲keymap_init函數終止儘快存在,所以您正在存儲一個指向該變量的指針。

你應該這樣做:

typedef struct { 
    ...  
    char* name; // just a simple pointer to char 
    ... 
} keymap_layer; 

... 
layer->name = malloc((strlen(layer_name)+1)*sizeof(char)); 
strcpy(layer->name, layer_name); 

如果你想改變存儲在layer->name後的字符串,請使用realloc

例如:

... 
layer->name = realloc(layer->name, (strlen(new_name)+1)*sizeof(char)); 
strcpy(layer->name, new_name); 
... 

Disclamer:沒有錯誤檢查贅述。

順便說一句:你沒有施放返回值mallocfriends

+0

給定'keymap_layer * layer = malloc(sizeof(keymap_layer));','layer-> name = realloc(layer-> name,(strlen(new_name)+1)* sizeof(char));'極有可能因爲'layer-> name'不會被初始化。 –

+0

@AndrewHenle我寫了_「如果你想改變存儲在層 - >名稱**以後**」的字符串,這意味着以前已經初始化了。 –

+0

非常感謝@MichaelWalz –

相關問題