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 :(得分:1)
可能对大小做出的唯一明确声明是stack
指向的内存为sizeof(struct Stack)
,而stack->array
指向的内存为4 * sizeof(int)
。 (假设malloc()
没有分配内存,在这种情况下它返回NULL
)。
sizeof(struct Stack)
是实现定义的 - 这意味着它在编译器,编译器设置,主机系统等之间有所不同。sizeof(int)
也是实现定义的。
实际上,sizeof(struct Stack)
至少其成员的大小总和。编译器可以在成员之间引入额外的填充。填充量因编译器而异。 (这是一个简单的解释 - 对每种类型的对齐要求会有更完整的解释。)
除非所有成员都属于char
,unsigned char
或signed char
(根据定义大小为1
)或这些类型的数组,否则其大小为实施定义。
两个不同的malloc()
调用返回的地址之间也没有保证关系。他们可能在一起" (例如,一个在记忆中紧接着一个),但它们可能是完全分开的。
答案 1 :(得分:0)
假设Stack
的定义是这样的:
typedef struct Stack{
int capacity;
int top;
int *array;
} Stack;
然后*stack
的分配空间量应为sizeof(int) /* for capacity */ + sizeof(int) /* for top */ + *X* /* for *array */
(即所有成员的总和'结构的大小)。
另一方面,array
的分配空间量为capacity*sizeof(int)
。
*stack
和*array
的分配在您的情况下是独立完成的 - 因为当您为*stack
分配时,您没有构建任何数组 - 您只需要分配一个指针(以及其他struct
成员) - 它不仅可以用于创建数组,还可以用于指向单个int
变量。在分配之后,您使用刚刚创建的指针为数组进行了分配。后面的分配(*array
)可能与您之前的分配(*stack
)相邻 - 但这取决于操作系统。
*X*
:指针的大小取决于您的PC架构(即您的处理器,RAM容量,操作系统版本(Win / Linux / Mac,x86 / x64)),编译器选项以及它是什么类型的指针(即它是int
指针,或double
指针)。 (参考1,2,3;以及an example)