你不能存儲在它沒有價值。這實際上是不可能的。這是由於我們的宇宙的物理定律:-)
而且,這樣的:
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
循環中逐個手動複製元素,這樣可以更快地進行復制。但我在這裏使用循環,以便它的邏輯更加明顯(希望如此)。
你不能真的「刪除」你的數組,因爲你沒有執行動態內存分配。檢查malloc /免費版 – Alexis
由於您已經使用過dism2A03,因此無法將其初始化並且它們將包含一些值,無論如何。但是編譯器有時會對此進行警告,當你試圖在不初始化的情況下使用變量時,這就是所謂的未初始化變量,即。當程序員不知道變量中包含哪些可能導致程序出錯的變量時。 –