Попытка вставить данные с указателем на структуру, вызывая ошибку сегментации - PullRequest
0 голосов
/ 17 апреля 2020

Когда я пытался реализовать свою собственную карту (строкового типа), я столкнулся с проблемой, которая вызывает ошибку сегментации, в то время как попытка поместить данные в «значение» соответствует ключу, который я пытаюсь обновить.

это объявление структур, структура карты является абстрактной, поэтому ее указатель находится в заголовочном файле:

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 дней я попробовал все и не могу найти решение.

1 Ответ

0 голосов
/ 17 апреля 2020

У вас много проблем, некоторые из которых перечислены в комментариях.

Но причина root, похоже, заключается в том, что вы фактически не выделяете память для struct KeyValue структура объектов. Это означает, что map->elements[index] будет неопределенным и недействительным указателем для всех возможных индексов.

Вам необходимо выделить память для map->elements[index].

Возможно фиксированная версия функции 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;

    // Allocate memory for the structure
    map->elements[index] = malloc(sizeof map->elements[index]);

    // Make the key and value pointers point to the newly allocated "temporary" strings
    map->elements[index]->key = tmp_key;
    map->elements[index]->value = tmp_value;

    map->size++;

    return MAP_SUCCESS;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...