2012-12-09 58 views
2

我必须使用链表概念创建程序。它适用于Ubuntu的,ideone.com,但是当我把它提交给大学的测试仪,它报告分段故障/总线错误/内存 超限/堆栈超出限制(列表中的一个)。程序正在运行,但测试引发了分段错误

也许,问题是内存释放,因为只有DEVCPP跌下来,并且它会导致一段代码,我使用自由。

因此,我使用了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

请注意您的压痕(和整体的编码)的风格,它是不可读的。另外,你不应该使用'malloc()'的返回值,并且返回'void'的函数末尾的'return'是多余的(C不是BASIC)。 – 2012-12-09 21:08:22

回答

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

注意,我还从malloc通话脱离的铸造到(char*)。您还应该删除其他malloc通话中的演员。如果这是直C,这是...


试纸说:正确的,但可能是不完整的。不是newItem的malloc也只是分配指针的大小。

您应该分配的结构是这样的:

TITEM *newItem = malloc(sizeof(TITEM)); 
+0

+1尤其适用于最后一个条款。 – 2012-12-09 21:11:23

+1

正确但可能不完整。不是newItem的malloc也只是分配指针的大小。 – Dipstick

+0

哦,好点子。我想是的。应该是'sizeof(TITEM)'而不是。将添加到我的答案。 – paddy

相关问题