2017-05-25 69 views
0
int capacity =4; 
struct Stack* stack = 
    (struct Stack*) malloc(sizeof(struct Stack)); 
stack -> capacity = capacity; 
stack -> top = -1; 
stack -> array = (int*) malloc(stack -> capacity * sizeof(int)); 

將爲堆棧和數組分配什麼大小。數組內存分配是否會在堆棧下進行,否則將分開分配。什麼大小將被分配給堆棧和數組。數組內存分配是否會疊加或將分別分配

+0

誰教你施放'malloc'的結果? – DeiDei

+0

@DeiDei可能有人用過C++編譯器編譯c代碼;) – LPs

回答

1

可以進行的有關大小的唯一明確的說法是,內存指向stacksizeof(struct Stack)和指向的內存是stack->array將是4 * sizeof(int)。 (假設malloc()不會分配內存,在這種情況下它將返回NULL)。

sizeof(struct Stack)是實現定義 - 這意味着它在編譯器,編譯器設置,主機系統等之間有所不同。sizeof(int)也是實現定義的。

實際上,sizeof(struct Stack)將是至少其成員的大小的總和。編譯器可能會在成員之間引入額外的填充。編譯器之間的填充量有所不同。 (這是一個簡單的解釋 - 對每種類型的對齊要求都會有更完整的解釋)。

除非所有的成員都char類型,unsigned char的,或signed char(其具有由定義大小1),或陣列的那些類型的,它們的大小是實現定義。

由兩個不同的malloc()調用返回的地址之間也沒有保證關係。他們可能是「在一起」(例如,一個緊跟在另一個之後),但他們可能完全分開。

0

假設Stack定義是這樣的:

typedef struct Stack{ 
    int capacity; 
    int top; 
    int *array; 
} Stack; 

然後分配空間*stack量應sizeof(int) /* for capacity */ + sizeof(int) /* for top */ + *X* /* for *array */(i.e-所有成員的該結構的大小的總和)。

另一方面,array的分配空間量爲capacity*sizeof(int)

*stack*array分配已在你的情況下獨立完成的 - 因爲當你爲*stack使分配,你是不是構建任何陣列 - 你只是分配一個指針(連同其他struct成員) - 這可以不僅可以用來創建一個數組,而且也可以用來指向一個單一的int變量。分配之後,您使用剛剛創建的指針爲數組分配數據。後面的分配(*array)可能與您先前的分配(*stack)相鄰 - 但取決於操作系統。 (指您的處理器,內存容量,操作系統版本(Win/Linux/Mac,x86/x64)),編譯器選項以及什麼類型的指針的大小取決於您的PC的體系結構它的指針(即它是一個int指針,或一個double指針)。 (參考文獻1,2,3;和an example