2012-12-09 39 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

相關問題