C 堆栈分配大小

标签 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

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

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

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

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

谢谢!

最佳答案

正如其他人所提到的,没有真正正确的答案。这是一个糟糕的问题,为了回答这个问题,您必须假设 C 未定义的事物。

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

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

上面评论中所有关于sizeof(int) 的讨论都是毫无意义的;堆栈上没有 int。或者堆,就此而言;您实际上从未分配过任何 struct B

关于C 堆栈分配大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48348152/

相关文章:

c++ - SDL 为什么在堆上而不是堆栈上创建纹理

c - 收割丧尸? [C]

arrays - 在 Go 中将指针转换为数组

c++ - 你如何复制一个对象?

c++ - 进程间通信:传递C样式结构与C++对象

methods - Go嵌入结构调用子方法而不是父方法

c - C 中是否存在可以分配/强制转换为限制性更强的原型(prototype)的通用函数指针之类的东西?

c++ - 将表传递给 c/c++ 的简单 lua 示例

编译交叉编译器来编译内核,使用MinGW

c++ - 如何将字符串 vector 转换为特定结构的 vector