在堆或堆栈上的struct中的静态数组?

时间:2015-10-13 03:37:28

标签: c struct dynamic-arrays

假设你有一个静态数组作为library(data.table) setDT(df)[, .(rbi=sum(rbi)), by= .(year, team)] # year team rbi #1: 2001 NYY 78 #2: 2001 BOS 55 #3: 2002 DET 77

的属性
struct

...初始化等等......

现在结构中的静态数组被认为是在堆还是堆栈上?另外,在结构中使用具有指定大小的数组与动态分配的数组相比更高效,即一旦指定动态内存就指向动态内存的指针,属于分配时间的属性?如果它在堆栈上,那么当结构被释放时,堆栈是否会消除变量?

3 个答案:

答案 0 :(得分:4)

您正在使用malloc函数来分配内存 因此,使用malloc函数为任何变量或结构分配内存,它将仅在堆中分配内存。 你声明一个变量“a”,这是结构的成员。所以,在这里你没有分配内存。你只需要声明一个结构。 之后使用malloc分配内存,此处只有内存将在堆中分配。

答案 1 :(得分:0)

在你的代码中struct example的大小为5个字节,其中包含字符数组。使用malloc命令,您已经分配了5个字节,其中包含完整的结构。 malloc将从堆中分配内存。字符数组array是分配内存的第一个(也是唯一的)5个字节。

鉴于这是一个少量的内存,你可能只想要一个堆栈变量来保存它而不是分配堆。如果您仅在功能期间使用它。在这种情况下,你可以简单地去:

struct example  exp;

现在这只是堆栈上的一个结构,所以没有用于分配它的开销。当然,如果这是一个庞大的结构,那么这样做是不明智的。

答案 2 :(得分:-1)

数组是结构的一部分。无论结构在哪里,数组都在其中。

如果使用堆,则与分配可变大小的数组没有什么不同。实际上,您可以增加分配的大小,它会为数组提供更多空间。例如。如果你分配10个字节,你将能够在数组中使用10个元素 - array [0]到array [9]。反过来说,如果只分配2个字节,你仍然可以使用数组的2个元素 - array [0]和array [1]。因此,您指定的数字5仅适用于sizeof()。

当然,如果你将它用作堆栈中的局部变量,那就完全不同了。