C结构的总大小

时间:2014-09-16 02:22:15

标签: c memory struct

我有一个基本的内存分配相关问题。 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个字节)+ barney(4个字节)+ bambam(?)。 bambam指向碎石类型的大小是多少?

对于flinstone = wilma(4个字节?)+ fred(4个字节)+ dino(sizeof(rubble))

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

1 个答案:

答案 0 :(得分:1)

因此。我将做一些假设。

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

此外,我假设intint32_t相同。 shortint16_t。并且charint8_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对齐的情况。