我正在编写一个初始化功能,以在链接列表中初始化第一个节点。我正在尝试添加一个字符串名称以标记每个节点,但是当功能返回时,会得到怪异的行为。我将字符串直接传递到函数中,将另一个长度的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:您不投射malloc
和friends
的返回值。