【问题标题】:total size of C structs [duplicate]C结构的总大小[重复]
【发布时间】:2014-09-16 02:22:15
【问题描述】:

我有一个基本的内存分配相关问题。 C 中以下结构的总大小是多少?

typedef struct rubble
{
    int betty;
    char barney[4];
    struct rubble* bambam;
} rubble;

typedef struct{
    short* wilma[2];
    short fred[2];
    rubble dino;
}flinstone;

对于 rubble = betty(4 bytes) + barney (4 bytes) + bambam (?)。指向碎石类型的 bambam 指针的大小是多少?

对于 flinstone = wilma ( 4 bytes ?) + fred ( 4 bytes ) + dino( sizeof(rubble) )

在这种情况下,我们如何计算指向 short 类型的指针的大小?

【问题讨论】:

  • 取决于编译器和优化级别。
  • @JimZilla 一个指针指向的东西,它不包含它所指向的东西。
  • 指向short的指针或指向任何东西的指针将始终具有相同的大小,因为它们本质上是地址。这取决于程序可用的地址空间。
  • @enhzflep:请注意,指针的大小不必全部相同。 stackoverflow.com/questions/6751749/size-of-a-pointer
  • @enhzflep:这是一个例子:stackoverflow.com/a/399999/47453

标签: c memory struct


【解决方案1】:

所以。我会做一些假设。

其中之一是所有指针都具有相同的大小。我还将假设您在 64 位平台上,这意味着您的所有指针可能都是 8 字节长。

此外,我假设intint32_t 相同。 shortint16_t。而char就是int8_t,一个字节有8位。

typedef struct rubble
{
    int betty;             // offset = 0  size = 4
    char barney[4];        // offset = 4  size = 4
    struct rubble* bambam; // offset = 8  size = 8
} rubble;

所以这里的总大小可能是 16。

typedef struct{
    short* wilma[2];       // offset = 0  size = 16
    short fred[2];         // offset = 16 size = 4
    rubble dino;           // offset = 24 size = 16
} flinstone;

总大小为 40。

现在,请注意dino 开始于flinstone,然后您可以想象。这是因为rubble 需要 8 字节对齐。

现在,不同平台的对齐需求也可能不同,并且类型也可能具有不同的大小。但这是一个可能的结果。

结构的末尾也可能有填充。例如:

struct x {
    uint32_t a; // offset = 0  size = 4
    uint8_t  b; // offset = 4  size = 1
};

x 的总大小为 8,因为我们需要支持我们有一个 x 数组的情况,并保持 x[2].a 对齐。

【讨论】:

    猜你喜欢
    • 2010-12-22
    • 2012-01-22
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多