如何计算C中的结构大小

How to calculate size of a struct in C?

本文关键字:结构 何计算 计算      更新时间:2023-10-16

我有以下结构

struct node{
    int value;
    struct node *next;
    struct node *prev;
};

我认为大小必须大于sizeof(整数)。

,但它使如何计算此结构的整体大小感到困惑。

那么如何削弱大小?

我的意思是我想手动手动计算它,而不是通过计算机...

大小至少为 sizeof(int) + sizeof(struct node *) + sizeof(struct node *)。但这可能更多,因为允许编译器在您的结构中添加填充字节

大的sizeof(int)sizeof(struct node*)如何取决于您的系统。如果您拥有32位系统,则它们可能是4个字节,或者如果您有64位系统,则它们可能是8个字节。但是,确定知道的唯一方法是使用编译器打印大小。

如果您在谈论32位应用程序,整数和指针为4个字节。因此,您的结构大小为12个字节。

struct node{
    int value;         // 0x0 - 0x4
    struct node *next; // 0x4 - 0x8
    struct node *prev; // 0x8 - 0xC
};

组装:

struct [0xDEADBEEF] {
    int 0x0;
    struct node *0x4;
    struct node *0x8;
};

旁注记忆指针在[[0xDeadBeef] 0x0上读取将返回节点 ->值的当前值等。

sizeof (struct node)是您结构字节中的大小。

它等效于:

=    sizeof (int)
  +  potential unnamed padding1
  +  sizeof (struct node *)
  +  potential unnamed padding2
  +  sizeof (struct node *)
  +  potential unnamed padding3

成员之间和结构末端的填充大小是定义的。

通常,结构的大小是每个成员字段的大小的添加。但是编译器可能会适当地为填充/对齐成员添加一些额外的字节。

因此,在您的情况下,

sizeof(struct node) = sizeof(int) + sizeof(struct node *) + sizeof(struct node *)
                 12 = 4 + 4 + 4  (on 32-bit)
                 20 = 4 + 8 + 8  (on 64-bit)

这是一般指南可能会根据您选择的编译器/平台而有所不同。

您无法手动计算确切的大小。您只能确定它至少是其成员大小的总和。

即。在这种情况下,无论系统上这些尺寸如何,它至少是sizeof(int) + 2 * sizeof(struct node *)

由于填充,对齐,它可能大于此最小尺寸。

c :正确的方法是针对所需的每个结构初始化int plain_size()方法。

struct anotherstruct {
  ...
  static int plain_size(){...};
}
struct struct1 {
  int a;
  int b;
  anotherstruct c;
  static int plain_size() {
    return sizeof(a)+sizeof(b)+anotherstruct::plain_size();
  }
}

请记住,这种大小可能不等于分配的结构的内存大小