2017-05-25 71 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