使用strtok\r时malloc.c断言失败

使用strtok\r时malloc.c断言失败,c,strtok,assertion,C,Strtok,Assertion,我用C语言(Ubuntu10.10)制作了一个UDP服务器。服务器相当大,它的一部分使用Strtok_r()进行一些字符串处理[我以前成功地使用过这个函数]。当服务器第一次运行时,它会正确处理来自客户端的数据。但当另一个客户端出现并发送一些数据时,程序会崩溃,并显示以下消息: MappingServer: malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1)

我用C语言(Ubuntu10.10)制作了一个UDP服务器。服务器相当大,它的一部分使用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()进行了尝试,结果是一样的

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


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

断言最可能的原因是注销
malloc
d块的末尾。一种可能性是:
separated_token
是否也
malloc
d?时间够长吗?你需要给我们更多的代码来诊断。。听起来像是分离的令牌出了问题。@user Pet peve of my,但请给你的问题一个描述性的标题。“C中的奇怪错误”并没有告诉我们实际的问题。如果你收到超过4个令牌,会发生什么情况?@user676987-你确定你永远不会得到超过4个令牌吗?好的,代码以更详细的方式:char delims[]=“/”;char*token=NULL;字符*分隔的_标记[4];int i,j;字符*最后;j=0;token=strtok(输入字符串、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)}
while(token!=NULL&&j<4)
可能是个好主意;还可以考虑使用<代码> STRUP U/COM>代替MalC/StrucP.@ USSR6698No,这不是更详细的,因为没有人能读到。尝试更新您的问题,不要在评论中发布完整的C程序。并确保告知自己接受和向上投票功能!