C堆栈分配大小

时间:2018-01-19 19:22:14

标签: c memory struct heap-memory stack-memory

我正在尝试回答有关以下代码的测验:

struct B {
  int _arr[5];
};
struct A{
  struct B* _b;
};

#include <stdlib.h>
int main(){
   struct A arr[5];
   struct A * a = (struct A*)malloc(sizeof (struct A));
   return 0;
}

我试图了解在程序堆栈上分配了多少内存(以字节为单位)。

所以我首先使用了以下(可能是错误的)逻辑:

  1. struct B的计算大小= sizeof(int)* 5 = 20;
  2. 结构A的计算尺寸= sizeof(B)= 20
  3. 我知道2实际上是错误的,因为当我打印sizeof(B)时,我得到了一个令人惊讶的8.我真的不明白为什么。

    无论如何,要了解在堆栈上分配了多少内存:

    1. 根据我的逻辑,arr的大小为20 * 5 = 100;
    2. 关于* a,我真的不知道。打印sizeof(a)显示8,但我不明白为什么。
    3. 总和是108
    4. 但实际答案是24:/ 我错过了什么?

      谢谢!

1 个答案:

答案 0 :(得分:2)

正如其他人所说的那样,并没有真正正确的答案。这是一个可怕的问题,为了回答它,你必须假设没有被C定义的东西。

但是,这可能不是很有帮助。既然你知道&#34;正确&#34;回答,很可能弄清楚他们是如何做到的:

如果您假设32位指针sizeof(struct A) == 4,那么struct A唯一字段是指向struct B的指针。所以arr4 * 5 = 20个字节,然后为a变量添加另外4个字节(这是另一个指针)。

上述评论中sizeof(int)的所有谈话都毫无意义;堆栈上没有int个。或者堆,就此而言;你永远不会真正分配任何struct B