将分配给堆栈和数组的大小。数组内存分配是否会在堆栈下进行,或者它将单独分配

时间:2017-05-25 13:24:09

标签: c struct malloc

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));

将为堆栈和数组分配多大的大小。数组内存分配是否会在堆栈下进行,或者它将单独分配。

2 个答案:

答案 0 :(得分:1)

可能对大小做出的唯一明确声明是stack指向的内存为sizeof(struct Stack),而stack->array指向的内存为4 * sizeof(int) 。 (假设malloc()没有分配内存,在这种情况下它返回NULL)。

sizeof(struct Stack)是实现定义的 - 这意味着它在编译器,编译器设置,主机系统等之间有所不同。sizeof(int)也是实现定义的。

实际上,sizeof(struct Stack) 至少其成员的大小总和。编译器可以在成员之间引入额外的填充。填充量因编译器而异。 (这是一个简单的解释 - 对每种类型的对齐要求会有更完整的解释。)

除非所有成员都属于charunsigned charsigned 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指针)。 (参考123;以及an example