2011-06-16 55 views
0

我聲明瞭一個數組並從用戶處獲取輸入。現在我想檢查重複的條目,它們必須被刪除並且內存應該被釋放。是否有可能釋放內存。截斷c數組中的問題

釋放未使用的內存並減少數組大小?

我輸入了[10,21,3,4,4,2,6,7,21,4,10],它應該被截斷爲[10,21,3,4,2,6,7],數組長度現在應該是7,我不想使用排序。

+1

這是一個截斷問題還是一個重複問題?下定決心。 – 2011-06-16 05:26:34

+0

確實有可能釋放內存。我們可以看到你正在嘗試的一些代碼嗎?這可能是你的功課嗎? – 2011-06-16 05:28:07

+0

如果你已經聲明數組的數組,然後刪除重複的值將不會減少大小或釋放任何內存,因爲你只是刪除內存空間中的值而不是內存區域.. – Stuti 2011-06-16 05:29:10

回答

1

我宣佈長度爲100的數組,並從用戶把輸入

所以你的意思是這樣的:

int input[100]; 
/* - ask 100 input from user */ 

是否有可能以釋放內存

答案不,因爲你靜態分配100個整數。

如果你希望能夠減少內存,那麼你應該做這樣的事情:

realloc(tempBuffer,uniqueN); 
:佈置第一 uniqueN項是唯一項後

int *tempBuffer=malloc(100*sizeof(int)); /* dynamic allocation */ 

for(i=0;i<100;++i) scanf("%d",&tempBuffer[i]);/* - ask 100 input from user */ 

int uniqueN=10 /* - assume the first 10 entries are the unique entries */ 

int *realBuffer=malloc(uniqueN*sizeof(int)); /* - allocate new buffer just enough for the unique entries */ 

for(i=0;i<uniqueN;++i) realBuffer[i]=tempBuffer[i]; /* - copy the unique entries from input to the final buffer */ 

free(tempBuffer); /* - tempBuffer is now unused, free it */ 

/* here we have realBuffer with just enough size, no unused memory */ 

另一個解決方案是realloctempBuffer

不要忘記檢查是否mallocrealloc返回NULL

+0

如果用戶輸入了21個值,我的程序被截斷,現在剩下11個值,現在如何使用free(),它不會發生,我需要從第10個位置到99 – 2011-06-16 05:51:49

+0

(請參閱我編輯的答案)1st:您必須使用動態分配malloc/realloc/calloc才能在以後「釋放」它。第二:數組是靜態分配的,所以你不能因爲你不需要而釋放它。第三:如果你從malloc請求100個整數,你只能釋放所有它,你不能選擇從10到99的空閒位置。你的問題的解決方案是將10個不同的條目複製到另一個表中(該表由另一個malloc創建( 10 * sizeof(int))或確保所有的第一個條目是唯一的後使用realloc。 – dragon135 2011-06-16 14:08:17

+0

這是很好的!謝謝 – 2011-06-16 15:46:46

2

簡單實現:

  1. 當你發現一個重複的條目,洗牌陣列左填補了國內空白(包括重複)。
  2. 使用realloc可以減少您的分配。

請注意,您根本無法刪除任意內存位置。如果填充間隙的運行時間存在問題,請考慮替代結構(如鏈接列表),這樣可以從中間刪除。

刪除重複條目是另一個問題。一般情況涉及排序。你可能有一個特殊情況允許更好的行爲。

+0

當然,這取決於數組是靜態還是動態分配的。靜態數組不能調整大小。 – 2011-06-16 05:41:03

+0

然後未使用的內存位置包含垃圾,我想釋放這些內存位置,謝謝我將嘗試使用realloc – 2011-06-16 05:43:32

4

在C中,您不能更改數組的大小。如果使用動態分配的內存(使用malloc()),則可以使用realloc()來調整內存區域的大小,或分配新的區域,將數據複製到內存區域並釋放舊區域。

通常可以接受的解決方案是簡單地讓部分數組不被使用。這是通過記錄在一個單獨的整數變量中使用多少條目來完成的。

+0

問題realloc是不是從位置0分配 – 2011-06-16 05:49:38

+0

@Abhishek'realloc()'不返回與原始分配相同的內存位置(如果我正確理解您的陳述)。也不能保證它會起作用,所以你必須適當地檢查返回值。 – Ben 2011-06-16 06:16:19

0

數組在C中不是動態的。也就是說,可以訪問超出最後一個的條目(假設數組變量本質上是一個指針)。但是,這不安全。

此外,您不能刪除「數組條目」。您可以移動剩餘的元素以佔據各自之前的位置。但是,由於數組是連續的內存塊,因此實際上不能刪除該元素佔用的區域。