c语言 - 将字符串传递给 init 函数并将其存储在 malloc'd 结构中



我正在编写一个初始化功能,以在链接列表中初始化第一个节点。我正在尝试添加一个字符串名称以标记每个节点,但是当功能返回时,会得到怪异的行为。我将字符串直接传递到函数中,将另一个长度的char*弄碎,然后将输入字符串strcpy'到这个新位置。我正在尝试将其存储在结构中。它在INIT函数中将其复制到结构中,但是一旦返回字符串,它就更改了,就像内存一样,在返回Init函数时会释放。

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

谢谢

这是高度腥的:

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;

keymap_init函数终止后,局部变量mal_name即将停止存在,因此您正在存储一个指向该变量的指针。

您应该这样做:

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:没有错误检查简洁。

btw:您不投射mallocfriends的返回值。

相关内容

  • 没有找到相关文章

最新更新