我必须使用链表概念创建一个程序。它适用于ubuntu,ideone.com,但是当我将它提交给大学测试人员时,会报告分段错误/总线错误/内存 超出限制/超出堆栈限制(列表之一)。
问题可能是内存释放,因为只有DevCpp掉线,它会导致我使用free的一段代码。
所以,我使用了Valgrind,但是我无法理解,日志中写的是什么,但它仍然写着“无效读取大小8”或无效写入大小8.而且它与内存分配有关( sizeof块是8,但我想并不总是如此)。进一步写道 - “错误摘要:来自48个上下文的76个错误(被抑制:2个来自2个)”和“总堆使用量:20个分配,20个释放,160个字节分配”(我认为这些行很重要)。
最后,有一些可能有问题的代码。
TITEM *borrowItem(const char *to)
{
TITEM *newItem = (TITEM *)malloc(sizeof(newItem));
newItem->m_Next = NULL;
newItem->m_To=(char *)malloc(sizeof(to));
strcpy(newItem->m_To,to);
newItem->m_Cargo = NULL;
return newItem;
}
我认为问题已经在分配中了。此函数用于创建新的列表项指针。 记忆在这里被释放:
void freeItem(TITEM *item)
{
free(item->m_To);
free(item);
return;
}
m_To是字符串,m_Next是下一个项目指针。
答案 0 :(得分:4)
您不能复制这样的字符串:
newItem->m_To=(char*)malloc(sizeof(to));
strcpy(newItem->m_To,to);
sizeof(to)
的值将是指针(4或8)占用的字节数。
你应该这样做:
newItem->m_To = malloc(strlen(to) + 1);
strcpy(newItem->m_To,to);
或者使用库函数strdup
,这基本上是相同的。
newItem->m_To = strdup(to);
请注意,我还从(char*)
电话中删除了演员malloc
。您还应该在其他malloc
来电中删除演员。如果这是直C,那就是......
试纸说:正确但可能不完整。不是newItem的malloc也只是分配指针的大小。
您应该像这样分配您的结构:
TITEM *newItem = malloc(sizeof(TITEM));