簡體   English   中英

malloc和array有什么區別

[英]What is the difference between malloc and array

我想問一下malloc和數組。

int * x;

x =(int *)malloc(sizeof(int));

int x [4];

它們之間有什么區別?

int *xp;之間最重要的區別int *xp; int xa[4]; sizeof(xp) != sizeof(xa)聲明對象的大小。

您可以將xa對象作為int *pparam傳遞給函數,但是不能將xp作為int aparam[4]傳遞給函數,因為aparam描述了整個4 int對象,而pparam描述了指向可能具有任何對象的對象的指針長度。

xa還將保留在鏈接程序的數據區域中,而指針malloc(sizeof(int)*4)將在運行時和堆上由系統調用分配。 在調試器中檢查巨大的地址差異!

好吧,這里有多個差異。

這會在堆上分配一個int的緩沖區。

int *x;
x = (int*)malloc(sizeof(int));

並且這會在堆棧或全局內存中分配由四個int的數組,或者如果它出現在結構或類的定義中,則可能將其聲明為結構或類的成員...

int x[4];

除了分配的位置,一個int的第一個已分配空間和四個int的第二個已分配空間。 但是假設您打算這樣做...

int *x;
x = (int*)malloc(sizeof(int) * 4);

...那么在這種情況下,兩個分配都是一塊內存,其大小是平台上int大小的四倍。 從使用角度來看,您幾乎可以以相同的方式使用它們。 在任何一種情況下, x[0]都是第一個int ,並且由於都未聲明為const ,因此您可以用相同的方式讀取或寫入其中之一。

因此,現在我們來了解兩種不同的分配內存方式的分配特征和生命周期的差異:

在使用malloc()的情況下,該請求的內存在堆上分配,但是您希望保留它的壽命很長,直到對其調用free()為止。 在另一種情況下,如果您在方法/函數內部將其聲明為局部變量,則其生存期是直到程序執行退出聲明它的范圍為止。 如果將其聲明為全局變量,則其生存期就是整個應用程序的生存期。 而且,如果您將其聲明為struct或class的成員變量,那么它的生存期就是其封閉的struct / class的生存期,無論如何。

暫無
暫無

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

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