Скорее всего, проблема здесь:
char* type = (char*)malloc(strlen(item.type)*sizeof(char)), *state = (char*)malloc(strlen(item.state) * sizeof(char));
strcpy(type, item.type);
strcpy(state, item.state);
Здесь вы забыли, что char
строки в C действительно называются завершенными нулями байтовыми строками . строка в C - это последовательность символов, оканчивающаяся на ноль. Этот ноль равен , а не , считаемому strlen
, но для него все еще требуется выделенное пространство.
Вам необходимо выделить strlen(...) + 1
байт для строк:
char* type = malloc(strlen(item.type) + 1);
char* state = malloc(strlen(item.state) + 1);
strcpy(type, item.type);
strcpy(state, item.state);
Или если ваша система имеет функцию strdup
(очень вероятно)
char* type = strdup(item.type);
char* state = strdup(item.state);
У вас также есть очень серьезные проблемы с вашей функцией grow
:
Item* new_repo = malloc((2 * repo->allocatedSlots)*sizeof(Item));
repo->items = new_repo;
free(new_repo);
Сначала вы выделяете память и new_repo
указывает на эту память.
Затем вы repo->items
указываете на ту же память . Теперь у вас есть два указателя, указывающие на одну и ту же память.
Затем вы освобождаете эту память, делая оба указателя new_repo
и repo->items
недействительными.
Вы не должны free(new_repo)
.
или использовать, например, realloc
вместо этого (как я уже предложил в комментарии):
int grow(Repo* repo) {
Item* new_repo = realloc(repo->items, 2 * repo->allocatedSlots * sizeof(Item));
if (new_repo == NULL)
return 0; // Failure to allocate
repo->items = new_repo;
repo->allocatedSlots *= 2;
return 1;
}