2

我必须使用链表概念创建一个程序。它适用于 ubuntu、ideone.com,但是当我将其提交给大学测试人员时,它会报告分段错误/总线错误/超出内存限制/超出堆栈限制(列表之一)。

可能问题是内存释放,因为只有 DevCpp 崩溃,它会导致我使用免费的一段代码。

所以,我使用了Valgrind,但是我不太明白,日志中写了什么,但它仍然在写“Invalid read of size 8”或Invalid write of size 8。而且它与内存分配有关(sizeof blocks是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 是下一项指针。

4

1 回答 1

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));
于 2012-12-09T21:09:50.730 回答