2014-02-13 101 views
0

我附上了一段代碼。我輸了很多。如果需要的話,我會附上更多:Segfault - 無效指針

unsigned char *datap = malloc (MAXSIZE); 
unsigned char *datapor = datap; 
//Here Im cutting a lot 
while((direntp = readdir(dirp)) != NULL) 
{ 
    datap = datapor; 
} 
//this line gives me exception 
free(datap); 

GCC顯示:

*** glibc detected *** /home/xf/xf/unzipper: free(): invalid pointer: 0x00002aaaab0b0108 *** 
+4

你似乎被切割了。你顯示的代碼不應該搞亂內存管理。您可能希望在調用'malloc()'和'free()'之間的'datapor'和'datap'上顯示每個操作。 – alk

+2

valgrind valgrind valgrind! – Dariusz

回答

0

你的malloc可能有失敗,因爲宏MAXSIZE的。如果你沒有足夠的內存,這可能會失敗。

開始檢查datap = malloc(MAXSIZE)是否是一個可行的指針。

unsigned char *datap = malloc (MAXSIZE); 
if (datap == NULL) 
    return -1; //malloc failed 
+2

是的,這可能是一個很好的做法..這裏沒有問題。 –

+0

雖然檢查malloc的返回值是合理的建議,但free(NULL)是完全有效的,所以它不會解釋錯誤。 –

+0

-1,用於推薦'free()'NULL'檢查,不需要。此外,代碼使用奇怪的拼寫'If'關鍵字。 :) – unwind

2

重新分配在while循環datap,所以當你打電話freedatap不再指向分配的內存。

(我假設的datapor變化省略代碼值)

+0

但datapor設置爲datap的初始值,它是從malloc返回的值,並且從未更改過。所以while循環所做的是重複將datap設置爲相同的值,這是從malloc返回的值。 –

+0

@Nigel重複指定相同的值沒有任何意義,所以我認爲'datapor'的值在省略代碼中發生了變化。 –

+0

你可能是對的,但恕我直言,這個假設應該是答案的一部分。按照它的規定,你的答案似乎是指所示的代碼,因此完全是錯誤的。 –