无缘无故地在c中获取sYSMALLOc错误

时间:2014-04-05 20:21:52

标签: c malloc assert

我在C程序上收到sYSMALLOc错误消息,我相信这个错误消息链接到我使用过的mallocs,而且我通过在malloc周围放置printf语句来发现这一点,这引起了问题。我看不出有什么不妥。有解决方案吗请帮忙,代码如下。 此外,它运行良好一段时间,然后它打破。带有错误消息,如下所示。

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

node * new(char c)
{   
    NODE *node = (NODE *)malloc(sizeof(NODE));  

    node->c = c;

    return node;    
}

修改 我刚刚发现以下代码可能是导致错误发生的原因。任何人都可以看到它有什么不对吗?

void move(char *string)
{
 int length = strlen(string);               
 node->s = (char *)malloc(length*sizeof(char));         

 strcpy(node->s, string);
}

此函数将字符串参数复制到node-> s

2 个答案:

答案 0 :(得分:2)

node * new(char c) {   
    NODE *node = malloc(sizeof(NODE));
    if(node) {  
     node->c = c;
    }
    return node;    
}

您的上述代码是正确的。但问题是你假设跟随行导致问题,因为执行此行之前的一些printf语句。这不正确。

上面的错误消息表明您的程序的先前逻辑(在其他地方)已损坏堆内存。此异常/错误消息仅在效果之后而不是真正的问题。您应该尝试在Linux上使用一些动态工具(Valgrind),在Windows上使用WinDBG / PageHeap来确定程序中内存损坏的根本原因。

修改 您可能需要查看我之前关于如何使用Valgrind和GDB调试程序的帖子:https://stackoverflow.com/a/22658693/2724703

对于简单用法,您可以使用以下命令(如果您的程序是a.out)

  

$ valgrind ./a.out

答案 1 :(得分:2)

字符串以零字节终止。你需要比其长度多一个字节(不要使用sizeof(char)它总是1)。所以代码

void move(char *string) {
  size_t length = strlen(string);               
  node->s = malloc(1+length); 
  if (!node->s) 
    { perror("malloc string"); exit(EXIT_FAILURE); };        
  strcpy(node->s, string);
}

或仅使用strdup(3)

void move(char *string) {
  node->s = strdup(string);
  if (!node->s)
     { perror("move strdup"); exit(EXIT_FAILURE); }
}

不要忘记malloc(3)可能会失败(在Linux上,您可以使用ulimit shell内置来降低某些限制来测试,即测试失败malloc的目的。)。

还可以使用valgrind(当然还有gdb调试器)。

BTW,this old question与你的非常相似!