2015-12-03 46 views
1

我試圖釋放字符串數組以這種方式:免費字符串數組給SIGABRT

unsigned char **strings = words.strings; 
for (int i = 0; i < noOfWords; ++i) { 
    free(strings + i); 
} 

,但我得到的消息SIGABRT(錯誤代碼134):

免費():無效的指針:0x0000000001c69018

但是,如果我這樣做:

unsigned char **strings = words.strings; 
for (int i = 0; i < noOfWords; ++i) { 
    free(strings[i]); 
} 

然後一切正常。

有人能指出我的區別嗎?這兩種形式不應該等同嗎?

回答

4

在您的第一個片段中,您錯過了取消引用指針。

free(strings + i); 

應該

free(*(strings + i)); 

free(strings + i);情況下,你正試圖增加指針到指針,即string本身。實際上,你想要的是釋放由string指向的有效有效的元素,其由string[i]給出。因此,string[i]基本上是取消參考指針string以獲取它指向的所有元素。

+0

是的,它非常明顯! – Alex

+0

我不應該問這個問題。我應該花更多的時間在它上面。這個想法是,當我釋放(字符串+ 0)時,整個字符串數組已被清除。但是當它釋放(string + 1)時,程序拋出了一個SIGABRT – Alex

+1

@SouravGhosh,謝謝! +1 – kay