2016-03-31 78 views
0

我想問一下malloc和數組。malloc和數組有什麼區別

int * x;

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

and

int x [4];

他們有什麼區別?

+1

[聲明和malloc之間的區別]可能的重複(http://stackoverflow.com/questions/10575544/difference-between-declaration-and-malloc) – Paulpro

回答

0

好吧,有很多不同之處。

此分配在堆上一個int的緩衝器...

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

而這種分配無論是在疊或全局存儲器四個int秒的陣列,或者聲明爲成員結構或類,如果它出現一個結構或類的定義中......

int x[4]; 

除了分配的位置,一個int第一分配的空間和分配的第二空間爲四個int s。但假設你的意思是要做到這一點,而不是...

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

...那麼在這種情況下,無論是分配的內存,你的平臺上的int的四倍塊。從使用的角度來看,您可以以幾乎相同的方式使用它們; x[0]在任何一種情況下都是第一個int,既然它們都沒有被宣佈爲const,您可以用相同的方式讀取或寫入。

所以現在我們得到的分配特性的差異&的分配內存的兩種不同的方式壽命:

malloc()「版的情況下,內存,以便請求在堆上分配,而其一輩子不管你想保留多久,直到你撥打free()就可以了。在另一種情況下,如果您將其聲明爲方法/函數內的局部變量,則其生命週期將一直存在,直到程序執行退出其聲明的範圍。如果您將其聲明爲全局變量,則其生命週期是整個應用程序的生命週期。如果你將它聲明爲結構體或類的成員變量,那麼它的生命週期就是它的封閉結構體/類,無論它是什麼。

1

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

您可以將xa對象int *pparam傳遞給一個函數,但你不能傳遞xpint aparam[4]的功能,如aparam描述了整個4 int對象和pparam描述了一個指向的對象可能具有任何長度。

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

+0

啊..是的.. sizeof()。我忘記了這一點。當然'sizeof(xp [0])== sizeof(xa [0])''。你也讓我把它們作爲參數傳遞給一個函數。給予好評。 – phonetagger