就像在主题中一样,我的大学项目有问题。我已经尝试自己做很长时间了,但由于我的全职工作,我的空闲时间是不够的。
我得到的错误:
all: malloc.c:3096: sYSMALLOc: Assertion `(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)' failed. Aborted
代码的错误部分
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 的第二个循环上(客户端选择了一个选项,它工作正常,然后菜单再次显示,他再次选择(哪个选项无关紧要),然后发生错误。
所以线路错误
while( (read_size = recv(sock , client_message , 100 , 0)) > 0 )
此问题的根源可能是什么?在一些 gorum 上我读到过有关内存损坏的信息,但我不知道如何解决这个问题。
还有一个小问题 - 这是分配内存的正确方法吗?
char *messagew ;
messagew=malloc(sizeof(char)*100+1);
我知道代码质量很差,但由于我的工作和第二所大学,我把这个程序分成几个部分,通常不太记得我在哪里停止了以及现在做什么。 由于程序大部分已完成,因此在解决此问题后我可能会有更多问题(现在修复任何内容可能会在代码数量和质量方面产生更多问题)。
当然,所有这些 TEMP 消息都只是在这里,以使代码更短 - 我有正常的消息发送给客户端,但我怀疑它们对解决问题有任何帮助。
最佳答案
来源是内存损坏,毫无疑问是由于某些 undefined behaviour 引起的在你的代码中,可能是 buffer overrun 。内存错误的本质是,根本原因可能与您收到错误的点相去甚远(说实话,您很幸运能够收到一条明智的错误消息)。
调试此问题的最简单方法可能是通过 Valgrind 运行您的程序.
关于c - UNIX:recv 的内存问题 - malloc.c:3096:sSYSMALLOC:断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26229617/