Моя программа является программой базы данных командной строки.Это мини.Вы можете создать объект внутри базы данных.Команда похожа на «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;