程序正在运行,但测试会引发分段错误

时间:2012-12-09 21:05:22

标签: c

我必须使用链表概念创建一个程序。它适用于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是下一个项目指针。

1 个答案:

答案 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));