2017-09-05 4 views
-2

Ich schreibe eine Init-Funktion, um den ersten Knoten in einer verknüpften Liste zu initialisieren. Ich versuche einen String-Namen hinzuzufügen, um jeden Knoten zu beschriften, bekomme aber seltsames Verhalten, wenn die Funktion zurückkehrt. Ich übergebe die Zeichenfolge direkt in die Funktion, mallociere ein weiteres Zeichen * der gleichen Länge und streiche dann die Eingabezeichenfolge an diese neue Stelle. Ich versuche, es in einem Char ** innerhalb der Struktur zu speichern. Es wird in die Struktur kopiert, während es innerhalb der init-Funktion ist, aber sobald es zurückgegeben wird, ändert sich die Zeichenkette, was so aussieht, wie der Speicher beim Zurückgeben der Init-Funktion freigibt.Übergeben Zeichenfolge an Init-Funktion und Speichern in einer Malloc'd-Struktur

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;} 

in meiner Aufgabe

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

Dank

+1

"Ich versuche, es in einem char ** innerhalb der Struktur zu speichern" - warum? – molbdnilo

+1

Bitte formatieren Sie Ihr Code-Snippet richtig und stellen Sie alle nützlichen verwandten Definitionen bereit, bevor Sie –

+0

@molbdnilo veröffentlichen, damit ich die Zeichenkette, auf die es in der Zukunft zeigt, leichter ändern kann. –

Antwort

0

Dies ist sehr fischig:

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; 

Die lokale Variable mal_name nicht mehr so ​​schnell existieren, wie die keymap_init Funktion beendet, so Sie speichern einen Zeiger auf diese Variable.

Sie sollten dies tun:

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

Wenn Sie die Zeichenfolge später in layer->name gespeichert ändern möchten, realloc verwenden.

Zum Beispiel:

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

Disclamer: Es ist kein Fehler der Kürze überprüft.

BTW: Sie werfen nicht den Rückgabewert von malloc und friends.

+0

Gegeben 'keymap_layer * layer = malloc (sizeof (keymap_layer));', 'layer-> name = realloc (layer-> name, (strlen (neuer_name) +1) * sizeof (char));' ist sehr wahrscheinlich fehlgeschlagen, da 'layer-> name' nicht initialisiert wird. –

+0

@AndrewHenle Ich schrieb _ "Wenn Sie die Zeichenfolge ändern möchten, die in Schicht-> Name ** später **" _ gespeichert ist, was bedeutet, dass wurde zuvor initialisiert. –

+0

Vielen Dank @MichaelWalz –

Verwandte Themen