结构成员如何在内存中分配?
在尝试为未来的C程序创建内存管理器时,我遇到了这个问题:
“当分配结构时,它们的成员字段是否按照指定的顺序存储?”
例如,请考虑以下结构。
typedef struct { int field1; int field2; char field3; } SomeType;
分配时,字段的内存地址是否在字段field1,field2,field3中? 或者这不保证?
简短回答 :它们按照结构中声明的顺序分配。
示例 :
#include #include 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中的内存分配概念。
进一步阅读 : 在 C – Structure Padding
查看C – Structure Padding
和Structure dynamic memory allocation in C
)(也是上例的来源)。
您可以保证field3
位于field2
之后的field2
之后,而field1
位于内存的开头(即field1
之前没有填充)。 但是,它们可能在其他成员之间填充(甚至在field3
之后)。 简而言之,声明它们的顺序是它们在内存中的排列顺序,尽管精确对齐和填充是实现定义的(但在第一个成员之前不会有任何填充)。
- 成员一个接一个;
- 每个成员的起始位置应完全按其长度划分:
例如:
typedef struct { char field1; int field2; double field3; } SomeType;
struct的第一个位置是x:
field1的长度为1(字节),filed2为4,field3为8
所以field1在x + 0,field2在x + 4~x + 7,field3在x + 8~x + 15,并且x + 1~x + 3被填充以使field2在正确的位置。
并且整个结构的长度应该完全由其最大的成员划分; 如果没有,填充一些字节到最后。