我在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
答案 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与你的非常相似!