Когда я пытался реализовать свою собственную карту (строкового типа), я столкнулся с проблемой, которая вызывает ошибку сегментации, в то время как попытка поместить данные в «значение» соответствует ключу, который я пытаюсь обновить.
это объявление структур, структура карты является абстрактной, поэтому ее указатель находится в заголовочном файле:
typedef struct KeyValue {
char* key;
char* value;
} *keyValue;
struct Map_t {
keyValue* elements;
int size;
int max_size;
int iterator;
};
это функция, которая выделяет память для всех элементов внутри карту и инициализируя их:
Map mapCreate() {
Map map = malloc(sizeof(*map));
if (map == NULL) {
return NULL;
}
map->elements = malloc(INITIAL_SIZE * sizeof(keyValue));
if (map->elements == NULL) {
free(map);
return NULL;
}
map->size = 0;
map->max_size = INITIAL_SIZE;
map->iterator = 0;
return map;
}
это функция, которая помещает элемент в ключ - переопределяет его, если уже существует существующий ключ, или создает новый, если необходимо:
MapResult mapPut(Map map, const char* key, const char* data) {
if (map == NULL || key == NULL || data == NULL) {
return MAP_NULL_ARGUMENT;
}
int index = mapFind(map,key);
char* tmp_key = copyString(key); //making a copy of the const key
char* tmp_value = copyString(data); //making a copy of the const data
if (index != ELEMENT_NOT_FOUND) {
keyValue element = map->elements[index];
element->value = tmp_value; //assigning the requested data to the value corresponds to the key
free(tmp_value);
free(tmp_key);
return MAP_SUCCESS;
}
if (map->size == map->max_size) {
if (expand(map) == MAP_OUT_OF_MEMORY) {
return MAP_OUT_OF_MEMORY;
}
}
return createKeyValue(map, tmp_key ,tmp_value); //creates a new key-value
}
и это функция createKeyValue:
static MapResult createKeyValue(Map map, char* tmp_key, char* tmp_value) {
// we use this function inside another one that checks for null arguments
assert(map != NULL);
if (tmp_key == NULL || tmp_value == NULL) {
return MAP_OUT_OF_MEMORY;
}
int index = map->size;
keyValue element = map->elements[index];
strcpy(element->key,tmp_key); // segmantation fault here
strcpy(element->value,tmp_value);
free(tmp_key);
free(tmp_value);
map->size++;
return MAP_SUCCESS;
}
Я получаю ошибку сегментации, когда эта функция пытается получить доступ с помощью функции strcpy. Я уже проверил, правильно ли я распределил память, и мне кажется, что я сделал все, что должен был сделать. Я действительно потерян, потому что в течение 2 дней я попробовал все и не могу найти решение.