【问题标题】:C stack allocation size [closed]C堆栈分配大小
【发布时间】:2018-06-29 02:39:43
【问题描述】:

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

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 :/ 我错过了什么?

谢谢!

【问题讨论】:

  • “实际答案”是“不能说”。
  • 结构 A = sizeof(B) = 20... 的计算大小应该是:Calculated size of struct A = sizeof(*B) = sizeof(pointer for the arch)
  • 不太可能sizeof(struct A) == sizeof(struct B)。你错过了这个练习的关键部分,指针与指针。
  • 这个问题没有明确的答案。例如,是什么让您认为sizeof(int) 是 4? C 语言确实指定了int 的大小。
  • C 标准并没有说一定要有栈。但是,我怀疑 在程序堆栈上分配的字节数 总是非负数,通常是整数...:D

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


【解决方案1】:

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

不过,这可能不是很有帮助。既然你知道“正确”的答案,就可以弄清楚他们是如何得出答案的:

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

上面的cmets中所有关于sizeof(int)的讨论都是毫无意义的;堆栈上没有ints。或者堆,就此而言;你从来没有真正分配过任何struct Bs。

【讨论】:

  • 重复最重要的事实:**C 语言中既没有堆也没有栈。它甚至不是强制性的 malloc 实际上被这个代码或任何分配的东西调用/使用。请参阅抽象机器和“as-if”规则。
  • 是的,但我认为@superuser123 只是想理解为什么他的老师认为 24​​ 是“正确”的答案。语言律师可能对他们没有帮助,作为在我学习材料时注意到很多问题的人,我可以确认纠正老师和/或质疑材料通常不是最好的课程行动(自私地说;显然,为未来的学生修好它会很好)。
猜你喜欢
  • 2014-05-17
  • 2010-10-30
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 2017-09-22
  • 2015-02-13
  • 2010-12-22
相关资源
最近更新 更多