Не удалось присвоить перераспределение - PullRequest
0 голосов
/ 30 ноября 2018

Моя программа является программой базы данных командной строки.Это мини.Вы можете создать объект внутри базы данных.Команда похожа на «CREATE ENTITY name».И у меня есть проблема при создании функции объекта.

Я перераспределяю память для моего массива структуры.Просто я расширяюсь.Но после второго расширения я теряю массив символов второго элемента (анкара) расширенного массива.Давайте посмотрим на код;

void task_create_entity(char* name)
{
int status;
ENTITY *e = create_entity(name, &status);
if(e)
{
    if(db->entities == NULL)
    {
        db->entities = new_entity_list(4);
        db->list_size = 4;
        db->entities[0] = e;
        db->size = 1;
    }
    else
    {
        int old_list_size = db->list_size;
        if(db->size >= db->list_size)
        {
            ENTITY **temp = expand_entity_list(db->entities, &db->list_size);
            if(temp != NULL)
            {
                if(db->entities != temp)
                    db->entities = temp;
            }
            else
            {
                printf("Operating system did not allocate memory, entities list could not expanded\n");
                drop_entity(e);
                db->list_size = old_list_size;
                return;
            }
        }
        db->entities[db->size++] = e;
    }
    task_list_entities();
}
else
{
    if(status == 1)
    {
        printf("Already exists a entity in database with this name\n");
    }
    else if(status == 2)
    {
        printf("Entity file could not created\n");
    }
}
}

Эта функция создает сущность и добавляет массив который в БД (struct).Если размер массива небольшой, моя функция расширяет его и добавляет.Я печатаю свое имя сущности с помощью функции task_list_entities() после того, как я создал новую сущность.Консольные входы и выходы:

CREATE ENTITY istanbul
istanbul

CREATE ENTITY ankara
istanbul
ankara

CREATE ENTITY seul
istanbul
ankara
seul

CREATE ENTITY monako
istanbul
ankara
seul
monako

CREATE ENTITY manchester
istanbul
ankara
seul
monako
manchester

CREATE ENTITY paris
istanbul
ankara
seul
monako
manchester
paris

CREATE ENTITY lizbon
istanbul
ºÖW
seul
monako
manchester
paris
lizbon

Список начинается с 4 элементов и расширяется до 4, 6, 9, 13, ... Это код расширения:

ENTITY** expand_entity_list(ENTITY** entities, uint32_t* size)
{
    *size = *size + (*size / 2);
    return (ENTITY**) realloc(entities, *size);
}

ПослеВторая операция расширения, я теряю имя второй сущности (анкара).

ENTITY* create_entity(char* name, int* status)
{
    ENTITY *entity = (ENTITY*) malloc(sizeof(ENTITY));
    entity->file = NULL;
    entity->name = duplicate_string(name);
    entity->records = NULL;
    entity->size = 0;
    entity->commited = 0;
    *status = 0;
    return entity;
}

Это новая функция списка сущностей:

ENTITY** new_entity_list(uint32_t size)
{
    return (ENTITY**) malloc(sizeof(ENTITY*) * size);
}

и это функция дублирования строки:

char* duplicate_string(char* origin)
{
    char *dup = (char*) malloc(sizeof(char) * (strlen(origin) + 1));
    strcpy(dup, origin);
    return dup;
}

В результате я не смог найти причину ошибки.Другие значения сущности не теряются.Просто чар * имя.Это структура объекта:

typedef struct entity
{
    char *name;
    FILE *file;
    RECORD **records;
    int size;
    uint8_t commited;
} ENTITY;

1 Ответ

0 голосов
/ 30 ноября 2018
ENTITY** expand_entity_list(ENTITY** entities, uint32_t* size)
{
    *size = *size + (*size / 2);
    return (ENTITY**) realloc(entities, *size);
}

*size в байтах или в сущностях?Вы, кажется, предполагаете, что можете хранить *size указатели в entities, но вы выделяете только *size символов.Я сомневаюсь, что указатели - это один байт на вашей платформе!

Вы, вероятно, хотите:

    return (ENTITY**) realloc(entities, *size * sizeof(ENTITY*));
...