2013-07-27 24 views
0

我想刪除一個初始化結構數組,例如重置陣列我該如何刪除typedef結構體的數組?

我的結構:

struct entry{ 
     char name[NAME_SIZE]; 
     int mark; 
    }; 

    typedef struct entry Acct; 
    Acct dism2A03[MAX_ENTRY]; 
    Acct clear[0];  << temp struct to set original struct to null 

我嘗試:

entry_total跟蹤如何在結構陣列dism2A03[x]在很多結構在其中已設置的值。

我試圖創建一個空的數組,相同的結構clear[0]。通過初始化陣列在dism2A03[x]環狀,並將它們設置爲clear[0]

 for(m=0;m<entry_total;m++){ 
      dism2A03[m]=clear[0];   
     } 
     break; 

然而,可以將它們設置爲0,我想他們成爲未初始化例如在它們中沒有值

+0

你不能真的「刪除」你的數組,因爲你沒有執行動態內存分配。檢查malloc /免費版 – Alexis

+0

由於您已經使用過dism2A03,因此無法將其初始化並且它們將包含一些值,無論如何。但是編譯器有時會對此進行警告,當你試圖在不初始化的情況下使用變量時,這就是所謂的未初始化變量,即。當程序員不知道變量中包含哪些可能導致程序出錯的變量時。 –

回答

2

你不能存儲在它沒有價值。這實際上是不可能的。這是由於我們的宇宙的物理定律:-)

而且,這樣的:

Acct clear[0]; 

是錯誤的。你不能有一個數組爲零的數組。有些編譯器會允許這樣做作爲擴展,但它不是有效的C.對於允許這樣做的編譯器來說,它不會做你認爲它的做法。

在我看來,你想要的是改變數組大小。爲此,您需要將要保留的元素複製到新數組中,然後釋放()舊數組。要做到這一點,你需要使用動態內存中創建dism2A03

Acct *dism2A03 = malloc(sizeof(Acct) * MAX_ENTRY); 
if (dism2A03 == NULL) { 
    // Error: We're out of memory. 
} 

(malloc()函數返回NULL如果沒有更多的可用內存和代碼檢查,通常所有,如果發生這種情況,你所能做的就是終止。程序。)

當你想要一個新的數組與一些元素去掉,那麼您應該備份當前的起始地址:

Acct* oldArray = dism2A03; 

然後創建一個新的你想要的新大小:

dism2A03 = malloc(sizeof(Acct) * NEW_SIZE); 
if (dism2A03 == NULL) { 
    // Error: We're out of memory. 
} 

複製從舊陣列(oldArray)到新的(dism2A03)所需的元素 - 這是你的,我不知道你要保留哪些 - 比後必須釋放舊陣列:

free(oldArray); 

作爲最後一點,你可能根本不想創建一個新的數組。

Acct dism2A03[MAX_ENTRY]; 

,並有您儲存了多少有用的元素是軌道指數變量:相反,你可以保留,您原來的,靜態分配的陣列(「靜態分配」你不使用malloc()表示)實際上在這個陣列中。起初,有0:

size_t dism2A03_size = 0; 

當您添加元素到數組,你這樣做,在由dism2A03_size給出的位置:

dism2A03[dism2A03_size] = <something> 
++dism2A03_size; // Now there's one more in there, so remember that. 

雖然這樣做,你需要確保dism2A03_size不會增長大於陣列的最大容量,在您的情況下爲MAX_ENTRY。所以上面會變成:

if (dism2A03_size < MAX_SIZE) { 
    dism2A03[dism2A03_size] = <something> 
    ++dism2A03_size; // Now there's one more in there, so remember that. 
} else { 
    // Error: the array is full. 
} 

正如你所看到的,添加一些東西到數組的末尾是相當容易的。從陣列末端移除某些內容同樣簡單;你只需將dism2A03_size減1。然而,從陣列中間的「刪除」的東西是指複製一個位置所有後續元素左移:

for (size_t i = elem_to_remove + 1; i < dism2A03_size; ++i) { 
    dism2A03[i - 1] = dism2A03[i]; 
} 
--dism2A03_size; // Remember the new size, since we removed one. 

注意,你不應該試圖刪除一個元素,如果數組是空的(意思是當dism2A03_size == 0

還有在數組中間添加新元素而不是末尾添加新元素的情況。但我希望現在你可以自己解決這個問題,因爲它基本上是一個反轉版本的元素移除案例。

另請注意,您可以使用memcpy()函數來代替在for循環中逐個手動複製元素,這樣可以更快地進行復制。但我在這裏使用循環,以便它的邏輯更加明顯(希望如此)。

+0

非常詳細的答覆感謝..我在C中的理解是低的,所以如果我沒有錯,上面的代碼將保存我當前數組的內存地址,然後它創建一個新的未初始化的'dism2A03'數組並將其放入內存替換舊的數組? –

+0

@DeepakTivari它不會替換舊的數組。這是一個新陣列。在釋放舊數組的內存之前,您需要將要從舊數組保留的元素複製到一個元素中。你可以用幾種方法複製元素(使用memcpy()或循環)。 –

+0

@DeepakTivari我添加了一些信息,說明如何在不實際分配任何新內存的情況下「調整」現有數組。 –

0

當你用這種方式聲明一個數組時Acct dism2A03[MAX_ENTRY];數組被分配在堆棧中,因此當函數執行return語句時它將被刪除。

您可以做的是通過malloc/calloc在堆中分配結構,然後通過free函數釋放該存儲區。

例如:

typedef struct entry Acct; 
    Acct * dism2A03 = calloc(MAX_ENTRY, sizeof(struct entry)); 
// .... 
    free(dism2A03);