簡體   English   中英

何時在指針上使用數組,反之亦然

[英]When to use an array over a pointer, or vice versa

我的理解是,除其他外,可以使用指針來允許您在需要時動態分配 memory(並且知道您需要多少),而不是預先使用 arrays 靜態分配它。

我很難確定何時更好地節省動態分配的計算時間並選擇更大的 memory 占用空間與更大的 memory 占用空間並使用一些計算時間來僅分配 ZCD69B4957F06CD818D7BF3D61980E2 需要。

有人可以對這個主題有所了解嗎? 是否有任何通用規則可能有所幫助?

通常,當您知道要處理的數據的總大小或至少知道數據的最大大小時,您希望使用數組。 如果您真的不期望尺寸有巨大的變化,這尤其適用——如果(例如)變化是從 10 到 20 個項目,那么無論如何分配 20 個並完成它可能是最簡單的(除非每個項目都是真的很大)。

如果您提前對數據的大小知之甚少,或者(並且很可能)可能很容易處理太多而無法計划放入堆棧,那么動態分配將變得更加有用。 動態分配的主要弱點是,如果您需要知道大小,您需要自己跟蹤它,並由您確保在完成后釋放 memory。 C 中的許多(尤其是困難的、煩人的)問題歸結為在 memory 被釋放后使用,或者在完成后忘記釋放 memory。

在以下情況下,您應該使用動態分配的 memory:

  • 您不知道在編譯時需要多少 memory
  • memory 的數量在運行時會有所不同
  • 你需要大量的 memory

在以下情況下,您應該使用靜態分配的 memory:

  • 你知道編譯時的大小
  • 所需的 memory 量低

使用動態分配的 memory 需要使用系統調用,這是您程序向操作系統詢問某些內容的時候。 您會受到速度損失,因為該進程可能會失去給予另一個進程的“處理時間”。 操作系統需要做很多事情來完成調用。 進行系統調用以詢問 memory 是一個比僅寫入存儲在進程堆棧中的數組更重的過程。

當您的數據是動態的,或者您需要從程序的不同區域傳遞數據時,您可以使用動態容器。

1 - 動態數據 假設您有一份鄰居列表。 他們在你的街道上建了一座新房子,你必須在名單上添加一個人,但你只為 15 個鄰居分配了足夠的空間。 這個動態 memory 將允許您增加該容器的大小。 這不是它的工作原理。 實際上,它找到了一個新的 memory 的必要大小的塊,然后將舊容器復制過來。

或者另一個例子。 假設您正在編寫一個跟蹤地址簿的程序。 您的一位用戶有十個聯系人。 另一個用戶是一家公司,有 50,000 名員工都需要存儲在此地址簿中。 您不想為擁有 10 個聯系人的用戶分配 50000 個空間,因此您可以准確分配所需的空間。

2 - 傳遞數據 當您分配 static 數據時,它被放置在堆棧上,然后在 scope 之后無法訪問。 所以如果你調用一些 function 來生成你的數組,然后將數組的 memory 地址傳回給它的調用者,你會得到一個運行時錯誤。 這是因為在退出 function 之后,數組超出了 scope,因此它從堆棧中彈出。

但是,如果您動態分配它,它會在堆上進行,並且在您釋放它或程序退出之前不會被釋放。 所以你可以只保留一個指向數組開頭的指針,並在整個程序中使用它,而不用擔心它會從 scope 出來,直到你想要它。

Arrays 只是 memory 的連續塊。 當你聲明一個數組時,你一個指針

int foo[5];

foo (沒有索引)是指向該數組中第一個元素的指針。

foo[0] = 1;
*foo = 1;

那些做同樣的事情,就像:

foo[1] = 2;
*(foo + 1) = 2;

當您使用int foo[5]; 您正在堆棧上創建。 這是當前 function 本地的,一旦您從 function 返回,它就不再有效。 如果你malloc() memory,你正在堆上創建數組(並有一個指向它的指針)

int *foo = malloc(sizeof(int) * 5);
foo[0] = 1;
*foo = 1;

您必須自己管理這個 memory,並在完成后free()它:

free(foo);

雖然這個問題有一個公認的答案。 讓我談談稍微不同的事情。 在 C 中,有時您可以使用在運行時確定大小的數組。 例如:

void foo (int a[], int n) {
    int buf[n];
    /* do something with buf[] */
}

這種 arrays 在堆棧中分配並且大小可變。 與做 malloc 的區別在於你不必free() memory; 當 function 調用存在時,這將被處理。 當然這也意味着你可能無法返回數組的地址。

暫無
暫無

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

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