2010-06-01 54 views
4

我有一個數組,但我不需要它的第一個(或最後一個)位置。所以我給數組的其餘部分指定了一個新變量,但是我應該釋放數組的第一個/最後一個位置。例如:在C中,是否可以只釋放數組的第一個或最後一個位置?

p = read_csv_file(); 
q = p + 1; // I don't need the first CSV file field 
// Here I'd like to free only the first position of p 
return q; 

否則,我已經到memcpy的數組另一個變量,除第一的位置,然後釋放原始數組。像這樣:

p = read_csv_file(); 
q = (int*) malloc(sizeof(int) * (SOME_SIZE - 1)); 
memcpy(q, p+1, sizeof(int) * (SOME_SIZE - 1)); 
free(p); 
return q; 

但是,然後我會有複製所有數組的開銷。

這是可能只釋放一個陣列的一個單一的位置?

+2

總之,不,它不是。 – 2010-06-01 00:35:46

回答

4

不可以。您只能撥打free()從撥打malloc()(或其中一個malloc()的朋友)獲得的完整區塊,而不是該區塊的一部分。

您最好的選擇可能是離開分配塊原樣,只需使用一個指向元素索引一個就好像它是數組的開始(而忽略了最後一個元素)。

使用memcpy作品如果它是真的這對於釋放這兩個元素非常重要。

您也可以將所有元素左移一位(即,將索引爲1的元素移至索引爲零等),然後調用realloc()來調整塊大小並移除最後兩個元素。然而,這並不是一個好主意,因爲最可能的結果是(a)底層堆分配實際上不會調整大小,並且您將移動物體並獲得任何好處,或(b)底層堆分配將調整大小,並且所有內容都將被第二次移動

2

這就是realloc(3)是。爲了釋放第一個數組元素,我建議修改算法。

相關問題