Heap Corruption при попытке перевыделить память под массив внутри стру

  • Автор темы Farrel
  • Дата начала
F

Farrel

Гость
#1
Проблема в следующем: есть кольцо структур. В каждой структуре есть два динамических массива: 1-й int, 2-й tm (масив структур). При попытке перевыделить память под любой из них вылетает ошибка Windows has triggered a breakpoint in библиотека на динамике.exe.

This may be due to a corruption of the heap, which indicates a bug in библиотека на динамике.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while библиотека на динамике.exe has focus.

The output window may have more diagnostic information.
структуры имеют следующий вид
C++:
struct book		 //ucetnaya kartochka knigi
{
char name[30];  //nazvanie knigi
char autor[30]; //avtor
int booknum;	 //uchetnii nomer knigi
int maxd;		 //maksimalnaya prodolgitelnost vidahi knigi
int kol;		 //kolichestvo ekzemplyarov
book *f;		 //ukazatel na predidushuu kartochku
book *b;		 //ukazatel na sleduushuu karochku
};
struct chel		 //uchetnaya kartochka chitatelya
{
char name[30];	  //imya chitatelya
char surname[30]; //familiya chitatelya
long tel;		 //telefon chitatelya
int num;		  //uchetnii nomer chitatelya
struct tm *t;  //massiv struktur s ukazaniem vrameni sdachi knig
int *booknum;  //massiv nomerov vidanih knig
int last;		  //kolichestvo vidanih knig
chel *r;		  //ukazatel na poslednuu dobavlenuu zapis v kolce (otnositelno tochki vhida)
chel *l;		  //ukazatel na vtoruu po nomeru kartochku
};
struct set			 //struktura hraneniya nastroek
{
int min;		  //minimalnoe vremya na kotoroe vidaetsya kniga
int koeff;		  //kolichestvo dnei na kotoroe uvelichitsya vremya min s kagdim ekzemplyarom
int maxbooks;
};
void abonement(int i, book* lib, chel* baza,set*s)	//funkciya vidachi/priema knig
{
book *b,*bb[10];
chel *c;
int l,k,p;
int n;
char m='y';
struct tm *t;
time_t tp;
time(&tp);	//poluchenie tekushei dati
t=localtime(&tp);	//perevid tekushei dati v lokalnii format
t->tm_year=t->tm_year;	
c=usersearch(baza);	//vizov funkcii poiska chitatelya
printf("\n");
if(i==1)	//flag vidachi knig
{
c->booknum=(int*)malloc(s->maxbooks*sizeof(int));
c->t=(tm*)malloc(s->maxbooks*sizeof(tm));
while(m!='n')
{
if(i==1)
{
b=booksearch(lib,0);	//poisk knigi
if(b->kol==0)	//oshibka esli vse knigi vidani
{
printf("vse knigi vidani\n");
}
else
{
printf("vidat knigu?\n1-da\n2-net\n");
k=0;
while(k!=1 || (l!=1 && l!=2))
{
fflush(stdin);
k=scanf("%d",&l);
}

if(l==1)
{
b->kol--;	
c->booknum[c->last]=b->booknum;	//zapis nomera vidavaemoi knigi v kartochku polzovatelya
c->t[c->last]=*t;	//zapis zapisi raschitanoi dati v sootv slot v strukture
datacount(b,c,&(c->t[c->last]),c->last);	//vizov funkcii podscheta dati sdachi knigi
c->last++;	//zapis kolichestva vidanih knig
}
}
}
puts("vidat eshe odnu? (y/n)");
m=getch();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//c->last- количество введенных элементов
c->booknum=(int*)realloc(c->booknum,(c->last)*sizeof(int));
c->t=(tm*)realloc(c->t,(c->last)*sizeof(tm));
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else	//flag ustanovlen na priem knig
{
l=0;
b=lib;
for(k=0;k<c->last;k++)
{
if(c->booknum[k]!=0)
{
while(b->booknum!=c->booknum[k]) //poisk imeushihsya u chitatelya knig
b=b->b;
bb[l]=b;	//zapis ukazatelya na knigu v massiv
l++;
b=lib;	//vozvrat ukazatelya b na biblioteku v pologenie lib
}
}
k=0;
while(k<l)
{
printf("%d %-30s %-30s\n",k,bb[k]->name,bb[k]->autor);
k++;
}
printf("\n99-sdat vse knigi\nchislo ot 0 do 9- udalit sotv. knigu\n");
m='y';
while(m!='n')
{
p=0;
n=-1;
while(p!=1 && !(n==99||n==0||n==1||n==2||n==3||n==4||n==5||n==6||n==7||n==8||n==9))
{
fflush(stdin);
p=scanf("%d",&n);	//vibor regima priema knig
}
if(n==99)	//priem vseh knig
{
while(k!=0)
{
c->booknum[k-1]=0;	//udalenie zapisanogo v kartochku chitatelya nomera knigi
bb[k-1]->kol++;	//uvelichenie kolichestva imeushihsya knig
k--;
}
c->last=0;	//oblulenie kolichestva knig, vidanih chitatelu
return;
}
else	//priem konkretnoi knigi
{
c->booknum[n]=0;	//zamena nomera udalyaemoi knigi na 0 
bb[n]->kol++;	//uvelichenie kolichestva imeushihsya knig
if(n!=c->last-1)
{
while(n!=c->last-1)		//cikl perezaposi nomerov vidanih knig v kartochke chitatelya (dlya udaleniya probelov t.e. nulei v massive)
{
c->booknum[n]=c->booknum[n+1];	//
c->booknum[n+1]=0;
n++;
}
c->last=0;
while(c->booknum[c->last]!=0) c->last++;
}
}

printf("prinyat eshe?\n");
m=getch();
}
}
}
 
F

Farrel

Гость
#2
Ко всему прочему обнаружил, что в code gear всё работает идеально, а вот visual по-прежнему не пропускает этот баг.