2013-06-26 84 views
2

當我使用malloc()分配內存時,我遇到free()函數的問題。segfault on free()指向char的指針*

程序運行時,會產生分段錯誤。我產生了一個程序的核心轉儲。當我使用gdb時,它在調用free()時顯示segfault。

這是我的代碼:

char * temp_filename; 
temp_filename = (char *) malloc(50); 
temp_filename = strrchr(package->_local_filename, '/'); 
strcat(package->_cache_filename, temp_filename); 
free(temp_filename); 

我無法弄清楚我的錯誤。有人幫我找到我的錯誤嗎? 感謝 * 對不起有關的代碼錯誤回報,現在是OK *

+2

您不要在malloc和free之間的任何位置使用'temp_filename'。你確定這是你所有的相關代碼嗎? – Paulpro

+1

另外,你確定segfault沒有發生在行嗎?當'package-> cache_filename'沒有爲自己指定足夠的分配內存以及'temp_filename_dest'的長度時,'strcat'可以發生段錯誤。 – Paulpro

+0

感謝您的幫助!現在我知道我的錯誤! –

回答

3

你的指針到其他字符串覆蓋你分配的指針,你正在尋找:

temp_filename = (char *) malloc(50); 
temp_filename = strrchr(package->_local_filename, '/'); 

,然後你釋放該指針錯誤,因爲它不再是由malloc()返回一個指針:

free(temp_filename); 

要修復,請刪除分配和釋放的代碼。

char * temp_filename; 
temp_filename = strrchr(package->_local_filename, '/'); 
strcat(package->_cache_filename, temp_filename); 
+0

我無法釋放「temp_filename」使用的內存? –

+0

@VitorLuis:你在'strrchr()'調用之後已經覆蓋了指針的值,因此你永遠不會使用那個內存。所以,你可以不首先調用'malloc()'。 – jxh

+0

很酷,謝謝你的幫助! –

0

嘗試使用strncat函數,而不是strcat的,並確保你不會溢出你分配的緩衝區的末尾。

2

問題是temp_filename未指向使用malloc()分配的內存。相反,它包含一個指針進package->_local_filename

temp_filename = strrchr(package->_local_filename, '/'); 

您可以刪除通話malloc()free()因爲它們是不必要的。

+0

+1,也是YOMAD。 – jxh

+0

很酷,謝謝你的幫助! –

相關問題