연결 목록의 첫 번째 노드를 초기화하는 init 함수를 작성 중입니다. 각 노드에 레이블을 지정하기 위해 문자열 이름을 추가하려고하지만 함수가 반환 될 때 이상한 동작이 발생합니다. 문자열을 함수에 직접 전달하고 동일한 길이의 다른 char *를 malloc 한 다음 입력 문자열을이 새 위치로 strcpy'ing합니다. 구조체 내의 char **에 저장하려고합니다. 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;
지역 변수 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 : 간결성을 확인하는 오류가 없습니다.
BTW : malloc
및 의 반환 값을 캐스팅하지 않습니다 friends
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다