就像在主题中我的大学项目有问题。我已经尝试过很长一段时间了,但是在我的全职工作中,我的空闲时间还不够。
我得到错误:
all:malloc.c:3096:sYSMALLOc:断言`(old_top ==(((mbinptr)(((char *)&((av) - > bins [((1) - 1)* 2 ])) - __builtin_offsetof(struct malloc_chunk,fd))))&& old_size == 0)|| ((unsigned long)(old_size)> =(unsigned long)(((__ builtin_offsetof(struct malloc_chunk,fd_nextsize))+((2 *(sizeof(size_t))) - 1))&〜((2 * (sizeof(size_t))) - 1)))&&((old_top) - > size& 0x1)&&((unsigned long)old_end& pagemask)== 0)'失败。 中止
代码有问题
void obslugagracza(int sock, int numergracza){
int wybor, read_size, kto, ile;
char client_message[1000];
char message[1000];
time_t rawtime;
while(wyscig==0)
{
wypisz("Co chcesz zrobic?\n\n1 - Sprawdz ilosc kredytow\n2 - Dodaj kredytow\n3 - Wyplac kredyty\n",sock);
wypisz("4 - Kto w nastepnym wyscigu?\n5 - Wyniki poprzedniego wyscigu\n6 - Obstaw najblizszy wyscig\n7 - Kiedy wyscig?\n\n", sock);
while( (read_size = recv(sock , client_message , 100 , 0)) > 0 )
{
if(wyscig==1)
break;
wybor=atoi(client_message);
if(wybor==1)
{
sprintf(message,"TEMP %i \n",plist[numergracza].money);
wypisz(message,sock);
sleep(4);
}
else if(wybor==2)
{
wypisz("TEMP", sock);
read_size = recv(sock , message , maxnamel , 0);
message[read_size-1]=0;
plist[numergracza].money+=atoi(message);
sprintf(message,"TEMP",plist[numergracza].money);
wypisz(message,sock);
sleep(4);
}
else if(wybor==3)
{
wypisz("TEMP", sock);
read_size = recv(sock , message , maxnamel , 0);
message[read_size-1]=0;
if(atoi(message)>plist[numergracza].money)
wypisz("TEMP", sock);
else
{
plist[numergracza].money-=atoi(message);
sprintf(message,"TEMP",plist[numergracza].money);
wypisz(message,sock);
}
}
else if(wybor==4)
{
wypisznastepnych(sock);
}
else if(wybor==5)
{
if(firstrace==0)
wypisz("TEMP", sock);
else
{
char messaget[100];
int i, horsen=8;
if (hnumber<horsen)
horsen=hnumber;
wypisz("TEMP", sock);
for(i=0;i<horsen;i++)
{
if(results[i].inrace==1)
sprintf(messaget,"TEMP %s \n", results[i].name);
wypisz(messaget,sock);
}
}
}
else if(wybor==6)
{
wypisznastepnych(sock);
sleep(3);
wypisz("TEMP", sock);
read_size = recv(sock , client_message , maxnamel , 0);
client_message[read_size-1]=0;
kto=atoi(client_message);
wypisz("TEMP", sock);
read_size = recv(sock , client_message , maxnamel , 0);
client_message[read_size-1]=0;
ile=atoi(client_message);
if(ile>plist[numergracza].money)
wypisz("TEMP", sock);
else
{
plist[numergracza].money-=ile;
plist[numergracza].bet+=ile;
plist[numergracza].bethorse=kto;
sprintf(message,"TEMP",race[kto], ile);
wypisz(message,sock);
}
}
else if(wybor==7)
{
time( &rawtime);
sprintf(message,"TEMP",(int)(nextr-rawtime)/60, (int)(nextr-rawtime)%60);
wypisz(message,sock);
}
else
{
wypisz("TEMP",sock);
}
sleep(3);
wypisz("Co chcesz zrobic?\n\n1 - Sprawdz ilosc kredytow\n2 - Dodaj kredytow\n3 - Wyplac kredyty\n",sock);
wypisz("4 - Kto w nastepnym wyscigu?\n5 - Wyniki poprzedniego wyscigu\n6 - Obstaw najblizszy wyscig\n7 - Kiedy wyscig?\n\n", sock);
}
}
}
如果我理解正确,错误发生在while的第二个循环中(客户端选择了一个选项,它正常工作,然后菜单再次显示,他再次选择(不管选择哪个选项),并且发生错误。< / p>
在线错误
while( (read_size = recv(sock , client_message , 100 , 0)) > 0 )
这个问题可能是什么原因?在几个gorums上我读过有关内存损坏的内容,但我不知道如何解决这个问题。
一方面的小问题 - 这是分配内存的正确方法吗?
char *messagew ;
messagew=malloc(sizeof(char)*100+1);
我知道代码质量很糟糕,但由于我的工作和第二大学,我会分开执行此程序,通常不会记住我已停止的位置以及现在的位置。 由于程序大部分完成,我解决这个问题后可能会有更多问题(现在修复任何问题可能会产生更多代码数量和质量问题)。
当然所有这些TEMP消息都只在这里,为了缩短代码 - 我向客户端发送了正常的消息,但我怀疑他们对这个问题有所帮助。
答案 0 :(得分:1)
源代码是内存损坏,无疑是由于代码中的某些undefined behaviour引起的,可能是buffer overrun。内存错误的本质是这样的,根本原因可能远离你得到错误的地方(说实话,你很幸运得到一个明智的错误信息)。
最简单的调试方法可能是通过Valgrind运行程序。