2013-01-19 79 views
1

在程序結束時釋放內存時出現問題。 這是來自學校的練習,用ADT實現二叉樹並用數據類型字符特定實現。當我嘗試釋放時檢測到堆損壞(void * key)

釋放代碼:

void free_tree(TreeNode *root){ 
TreeNode *cur; 
if (!root) return; 
else{ 
cur = root; 
free_tree(cur->left); 
free_tree(cur->right); 
free(cur->key);    //throws an error! 
free(cur); 
} } 

這是我的malloc的密鑰本身(問題很可能是在這裏):

puts("Please enter a value for key of new node"); 
_flushall(); 
scanf("%s",&buffer); 
user_input = (char *) malloc(sizeof(char)*(strlen(buffer)+1)); 
strcpy(user_input,buffer); 
user_input[strlen(buffer)+1] = '\0'; 
p_node = create_tree_node(user_input); //this function append the new data to a new node, returns *TreeNode 
insert_node_by_value(&root,p_node,str_comp); 
break; 

這是我的錯誤:

Error Message

BTW釋放節點本身工作正常!

我會感謝您的幫助以及關於代碼功能的任何提示和意見。

functions.c的

全部粘貼代碼可以在這裏找到: http://pastebin.com/TqaNK5v8 - 功能

+0

當您嘗試寫入您不屬於自己的內存時會發生這種情況。你在哪裏分配內存? – Maroun

+0

請顯示'value'的定義。它是一個指針類型嗎? –

+0

typedef void * value; 「 – Lulu

回答

1

我所能找到的唯一實際的問題是:

user_input[strlen(buffer)+1] = '\0'; 

由於USER_INPUT已經「的strlen(緩衝)+ 1 '元素,它只能從0到strlen(緩衝區)進行索引。解決這個問題非常簡單,刪除這一行,strcpy的行爲就是複製源字符串的\ 0。

+0

」strcpy的行爲是複製源字符串的\ 0。「... 我是如何錯過的? – Lulu

1

99個chanches 100是CUR->鍵不分配或是free'd不止一次。

而且

user_input[strlen(buffer)+1] = '\0'; 

應該

user_input[strlen(buffer)] = '\0'; 

和緩衝區必須scanf函數之前已經分配給持有與scanf函數檢索輸入數據。

不能告訴更多的看你粘貼

希望這有助於

+0

另一種可能性是對相鄰分配的寫入訪問已超出並破壞了每個分配前綴的堆管理數據。 – Clifford

0

數組索引從0開始。因此,如果您分配n個字節,訪問第n個字節的正確方法是代碼: :

SomeArray[n-1] ; 
0

您正在將您的誤導診斷投影到其他人身上。請提供一個最小的可編譯測試用例供我們調試。最小意味着「顯示你的問題的症狀,沒有任何不必要的或不相關的代碼」。可編譯的意思是「能夠在我們的機器上編譯而不會修正錯誤或填充空白」。

在C中,您不需要強制轉換malloc的返回值。停止使用C++編譯器來編譯C代碼。你知道scanf可能會失敗嗎?我懷疑這就是爲什麼你在scanf之前錯誤地使用fflushing的原因。嘗試正確處理scanf失敗,而不是假設不可移植的黑客會爲你做。你知道strcpy會爲你終止目標字符串嗎?

你正在閱讀哪本書?

+0

不知道編譯器。 我知道scanf,這不是作業的目的,所以我不介意太多。我現在知道strcpy複製空終止。不看書 - 我正在讀老師的講座 – Lulu