Ошибка при free() структуры - C
struct SBook{
unsigned long long ISBN;
char Writer[200];
char Title[200];
int Whole;
int Taken;
};
void B_delete(struct SBook **Books, int *Num){ //Num - кол-во структур
struct SBook *OldBooks = *Books;
// спрашиваем у пользователя ввод, получаем "int find"
*Num-=1;
struct SBook *NewBooks = (struct SBook*) calloc(*Num - 1, sizeof(struct SBook));
for(int i=0; i<find; i++){
NewBooks[i].ISBN = OldBooks[i].ISBN;
strcpy(NewBooks[i].Writer, OldBooks[i].Writer);
strcpy(NewBooks[i].Title, OldBooks[i].Title);
NewBooks[i].Whole = OldBooks[i].Whole;
NewBooks[i].Taken = OldBooks[i].Taken;
}
for(int i=find; i<*Num; i++){
NewBooks[i].ISBN = OldBooks[i+1].ISBN;
strcpy(NewBooks[i].Writer, OldBooks[i+1].Writer);
strcpy(NewBooks[i].Title, OldBooks[i+1].Title);
NewBooks[i].Whole = OldBooks[i+1].Whole;
NewBooks[i].Taken = OldBooks[i+1].Taken;
}
*Books = NewBooks;
free(OldBooks);
free(TakenBooks);
}
на free(OldBooks); код завершается, vs пишет: проект.exe вызвал срабатывание точки останова. В чем проблема? Не понимаю, все посмотрел, все должно быть правильно
Ответы (2 шт):
Автор решения: return
→ Ссылка
Ваш код не имеет смысла, т. к. новый массив меньше старого, т. е. можно использовать его повторно. Если вы хотите массив с non-fixed-size (называется список), то он бы выглядел вот так:
typedef char* SBinary;
typedef unsigned long SSize;
typedef char SBoolean;
#ifndef TRUE
# define TRUE ((SBoolean)1)
#endif
#ifndef FALSE
# define FALSE ((SBoolean)0)
#endif
typedef struct List {
SBinary Data;
SSize Count;
SSize Capacity;
SSize ItemSize;
} SList;
typedef struct Index {
SSize Offset;
SBoolean IsFromEnd;
} SIndex;
inline SSize GetIndexOffset(const SIndex Index, const SSize Length) {
if (Index->Offset >= Length) { /*error handling*/ }
return Index->IsFromEnd ? Length - Index->Offset : Index->Offset;
}
void InitList(SList* List, const SBinary Data, const SSize InitialCapacity, const SSize ItemSize) {
List->Data = Data;
List->Count = 0;
List->Capacity = InitialCapacity;
List->ItemSize = ItemSize;
}
void _InitList(SList* List, const SSize InitialCapacity, const SSize ItemSize) {
InitList(List, malloc(InitialCapacity * ItemSize), InitialCapacity, ItemSize);
}
SBoolean EnsureCapacity(SList* List, const SSize additionalCapacity) {
SSize NewCapacity = List->Count + additionalCapacity;
if (NewCapacity < 8U)
NewCapacity = 8U;
else if (NewCapacity & (NewCapacity - 1U) != 0) { // если не является степенью 2-ки
SSize i;
for (i = 1; i < NewCapacity; i <<= 1) { }
NewCapacity = i;
}
if (List->Count + additionalCapacity <= List->Capacity) return FALSE;
SBinary NewData = malloc(NewCapacity);
memcpy(NewData, List->Data, List->Capacity * List->ItemSize);
free(List->Data);
InitList(List, NewData, NewCapacity, List->ItemSize);
return TRUE;
}
void Add(SList* List, SBinary Item) {
EnsureCapacity(1);
memcpy(List->Data + List->Count * List->ItemSize, Item, List->ItemSize);
}
void Insert(SList* List, SIndex Index, SBinary Item) {
SSize Offset = GetIndexOffset(Index, List->Count);
if (Offset == List->Count)
Add(List, Item);
else {
EnsureCapacity(List, 1);
SSize Base = Offset * List->ItemSize;
memcpy(List->Data + Base + List->ItemSize,
List->Data + Base, (List->Count - Offset) * List->ItemSize);
memcpy(Item, List->Data + Base, List->ItemSize);
}
}
// ...
Автор решения: AlexGlebe
→ Ссылка
Вы выделяете память мало. Второй раз минус один не нужно.
*Num-=1;
//struct SBook *NewBooks = (struct SBook*) calloc(*Num - 1, sizeof(struct SBook));
struct SBook *NewBooks = (struct SBook*) calloc(*Num , sizeof(struct SBook));
При порче памяти происходит неопределённое поведение и ошибки могут быть очень разными.