2011-06-26 34 views
-1

我在C(Ubuntu 10.10)中创建了一个UDP服务器。该服务器非常大,其中的一部分使用Strtok_r()进行了一些字符串处理[[以前我已成功使用此函数]]。当服务器第一次运行时,它会正确处理来自客户端的数据。但是,当其他客户端走来,并发送一些数据,程序崩溃,并显示以下信息:(!不管有多少客户[R如何来)malloc.c assertion在使用strtok_r时失败

MappingServer: 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 

如果我注释掉strtok_r()函数,则一切正常。这是造成该问题的代码是:

char delims[] = "/"; 
char* token = NULL; 
char* separated_token[4]; 
int i,j; 
char* last; 
j = 0; 
token = strtok_r(input_string, delims, &last); 
     while(token != NULL) 
     { 
     separated_token[j] = malloc(strlen(token) + 1); 
     strcpy(separated_token[j],token); 
     printf("%s ", separated_token[j]); 

     j++; 
     token = strtok_r(NULL, delims, &last); 
     } 

至于我能理解,代码确定,它完美的第一个客户。我有点困惑,这个错误是什么意思?我用strtok()试过,结果是一样的。

+1

断言的最可能原因是注销'malloc'd块的末尾。一种可能:是'seperated_token'还有'malloc'd?它足够长吗? – andrewdski

+1

你需要给我们更多的代码来诊断..尽管如此,声音就像'separated_token'一样。 – Node

+1

@用户佩佩我的宠物,但请给你的问题描述性的标题。 “C中的奇怪错误”告诉​​我们没有任何关于实际的问题。 – Bart

回答

1
malloc.c:3096: sYSMALLOc: Assertion 

这意味着堆内的malloc结构被破坏。尝试在valgrind中运行服务器以查找堆使用错误和/或内存损坏。

您添加的代码很难分析,因为没有代码会执行free(); separated_token[]数组的大小未知。处理完后是否释放()所有的令牌?您是否为separated_token[]阵列本身分配了足够的元素?在开始标记第二个请求之前,您是否将j计数器清零?

+0

@ user676987 - 你确定你永远不会得到超过4个令牌吗? – Node

+0

好的,更详细的代码: char delims [] =“/”; char * token = NULL; char * separated_token [4]; int i,j; char * last; j = 0; token = strtok_r(input_string,delims,&last); (token = NULL) separated_token [j] = malloc(strlen(token)+ 1); strcpy(separated_token [j],token); printf(“%s”,separated_token [j]); j ++; token = strtok_r(NULL,delims,&last); } – user676987

+1

'while(token!= NULL && j <4)'无论如何都是个好主意。也考虑使用'strdup'而不是malloc/strcpy。 – ShinTakezou

相关问题