结构成员如何在内存中分配?

时间:2013-12-23 04:54:28

标签: c memory-management struct

在尝试为未来的C程序创建内存管理器时,我遇到了这个问题:

“分配结构时,它们的成员字段是否按照指定的顺序存储?”

例如,请考虑以下结构。

typedef struct {
    int field1;
    int field2;
    char field3;
} SomeType;

分配时,字段的内存地址是否在字段field1,field2,field3中?或者这不保证?

3 个答案:

答案 0 :(得分:27)

简短回答:他们会按照结构中声明的顺序进行分配。


示例

#include <stdio.h>
#include <string.h>

struct student 
{
    int id1;
    int id2;
    char a;
    char b;
    float percentage;
};

int main() 
{
    int i;
    struct student record1 = {1, 2, 'A', 'B', 90.5};

    printf("size of structure in bytes : %d\n", 
        sizeof(record1));

    printf("\nAddress of id1        = %u", &record1.id1 );
    printf("\nAddress of id2        = %u", &record1.id2 );
    printf("\nAddress of a          = %u", &record1.a );
    printf("\nAddress of b          = %u", &record1.b );
    printf("\nAddress of percentage = %u",&record1.percentage);

    return 0;
}

<强>输出

size of structure in bytes : 16 
Address of id1 = 675376768
Address of id2 = 675376772
Address of a = 675376776
Address of b = 675376777
Address of percentage = 675376780

以下给出了上述结构存储器分配的图形表示。该图将帮助您非常轻松地理解C中的内存分配概念。

enter image description here


进一步阅读:查看C – Structure PaddingStructure dynamic memory allocation in C的{​​{3}}(也是上述示例的来源)。

答案 1 :(得分:6)

我们保证field3位于field2之后,field1位于field1之后,而field1位于内存的开头(即field3之前没有填充{ {1}})。但是,它们可能在其他成员之间填充(甚至在{{1}}之后)。简而言之,声明它们的顺序是它们在内存中的排列顺序,尽管精确对齐和填充是实现定义的(但在第一个成员之前不会有任何填充)。

答案 2 :(得分:0)

  1. 会员一个接一个地位于其中;
  2. 每个成员的起始位置应完全按其长度划分:
  3. 例如:

    typedef struct {
    char field1;
    int field2;
    double field3;
    } SomeType;
    

    struct的第一个位置是x:

    field1的长度为1(字节),field2为4,field3为8

    所以field1在x + 0,field2在x + 4~x + 7,field3在x + 8~x + 15,并且x + 1~x + 3被填充以使field2在正确的位置。

    整个结构的长度应该与其最大的成员完全分开;如果没有,请将一些字节填充到最后。