C 堆栈分配大小

C stack allocation size

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

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. 结构 B 的计算大小 = sizeof(int) * 5 = 20;
  2. 结构 A 的计算大小 = sizeof(B) = 20

我知道 2 实际上是错误的,因为当我打印 sizeof(B) 时我得到了一个令人惊讶的 8。我真的不明白为什么。

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

  1. arr的大小按照我的逻辑是20 * 5 = 100;
  2. 关于*a,我真的不知道。打印 sizeof(a) 显示 8,但我还是不明白为什么。
  3. 总和是108

但实际答案是 24:/ 我错过了什么?

谢谢!

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

不过,这可能不是很有帮助。由于您知道 "correct" 答案,因此有可能弄清楚他们是如何得出答案的:

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

以上评论中所有sizeof(int)的讨论都是毫无意义的;堆栈上没有 int。或者堆,就此而言;你实际上从未分配任何 struct Bs.