gpt4 book ai didi

c - 使用 strtok_r 时 malloc.c 断言失败

转载 作者:行者123 更新时间:2023-11-30 19:24:13 25 4
gpt4 key购买 nike

我用C语言(Ubuntu 10.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 中运行服务器以查找堆使用错误和/或内存损坏。

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

关于c - 使用 strtok_r 时 malloc.c 断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6484518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com