簡體   English   中英

我應該在什么情況下使用malloc? 我對何時在C中使用動態分配感到困惑

[英]In what situation am I supposed to use malloc? I'm confused by when dynamic allocation should be used in C

如果我想創建一個二維數組,其維度由用戶輸入指定,我是否不能僅在main函數中按順序執行此操作? 使用scanf確定尺寸后,我便可以使用這些尺寸創建數組了嗎? 據我了解,應該在運行時不知道所需空間的情況下使用malloc。 我不會在運行時知道所需的空間,但是我不必動態分配內存,它無論如何都可以工作,對嗎? 也許我完全誤會了一些東西。

通常,在C中使用三個原因可以使用動態分配:

  1. 該大小直到運行時才知道(另一種替代方法是VLA ,但這是C99,可能有危險,請參見原因2)。

  2. 該大小(最有可能)對於堆棧而言太大,可能會導致堆棧溢出。

  3. 該對象需要駐留在堆上,從而使其壽命比“自動”存儲更長。

當在編譯時不知道空間需求 ,或者當您需要對象能夠在其創建范圍之外保留 ,通常使用malloc

在C99中(與C的早期版本不同),還可以定義長度可變的一維數組,而無需使用malloc 但是許多人認為邪惡 ,因為沒有辦法解決內存不足的情況。

但是,如果您想要一個像多維數組一樣的東西(就象x[i][j]那樣能夠對其進行索引),而這些維直到運行時才知道,那么您將需要在某個地方使用malloc

這是動態分配需求的典型示例:制作動態容器。 由於您不知道元素的數量, 因此必須動態分配每個元素。 由於您是在循環中填充容器,因此每個元素都必須超過循環作用域。 這是“零一多”規則,其“多”部分立即需要動態分配:

int value;
node * my_list = NULL;

while (get_one_more_input(&value) == SUCCESS)
{
    node * elem = malloc(sizeof(node));

    elem->data = value;
    elem->next = my_list;
    my_list = elem;
}

這里的症結在於,實際的列表節點僅填充讀取輸入數據的循環 ,但顯然,它必須超出該范圍。 因此,沒有自動對象可以做,因為它只會活到范圍的結束,也沒有靜態元素可以做的,因為你可以不知道循環迭代次數事前。 動態生命周期和存儲管理是這里唯一的解決方案,而這正是它的主要目的。

在C語言中,您將手動進行很多操作,因為動態數據結構是計算的核心。 通過將所有動態管理邏輯包裝到隱藏的,可重用的代碼中,C ++可以使很多事情變得更加輕松和安全,而這些代碼無需作為使用者使用(盡管它仍在做完全相同的事情)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM