通过研究结构引出了一个问题,即结构如何通过编译器存储在内存中,这意味着要考虑
struct
{
int number;
char name[nam];
}h;
我想知道的是如何存储成员(这里是number
和name
)(无论它们是按顺序存储还是存储在随机位置,例如,如果数字存储在地址中2000和name
存储在2990)?
答案 0 :(得分:4)
内存按结构成员的顺序分配:
+------------+------------------+-----+-----+-----+-----+-----+-----+
| | ........ | | | | | | |
| | | | | | | | |
+------------+--------+---------+-----+-----+-----+-----+-----+-----+
+ + | name[0] name[nam-1]
+------+-----+ | +------------------+----------------+
| | |
| | |
v v v
number padding name[nam]
但是,与数组不同,为结构分配的内存可能会也可能不会被打包,即在任何成员的分配空间之后可能会有一些填充(但在第一个成员之前不允许填充)。
答案 1 :(得分:2)
您可以在Data structure alignment中找到答案:
数据结构对齐是数据的排列和访问方式 电脑记忆。 它由两个独立但相关的问题组成:数据 对齐和数据结构填充。当现代计算机读取时 从或写入内存地址,它将以字大小的形式执行此操作 块(例如32位系统上的4字节块)。数据对齐方式 将数据放入一个等于该字的某个倍数的存储器偏移量 大小,由于CPU的方式,提高了系统的性能 处理记忆。要对齐数据,可能需要插入一些数据 在最后一个数据结构的末尾和之间的无意义字节 下一个开始,即数据结构填充。
答案 2 :(得分:2)
字段将始终按写入顺序排列,但它们之间可能存在填充。
答案 3 :(得分:2)
我在第一年的演讲中复制了这张图片。我希望它有所帮助(它应该):
答案 4 :(得分:2)
来自C99 6.7.2.1/13结构和联合说明符
在结构对象中,非位字段成员和单位 哪些位字段驻留的地址按顺序增加 他们被宣布。适当地指向结构对象的指针 转换后,指向其初始成员(或者如果该成员是 位字段,然后到它所在的单元,反之亦然。 结构对象中可能有未命名的填充,但不在其中 开始。
因此,字段name
必须遵循示例中的字段number
,但可能会在两个字段之间添加填充。在name
字段之后也可能有填充,用于确保这些结构的数组将使每个元素适当对齐。
答案 5 :(得分:-1)
阵列可以以两种不同的方式存储。在你的结构中,如果它的大小是常量,如char array[42]
,或者,如果它们在编译时具有未知大小,则使用malloc
分配,并在结构中有一个指向数组的指针。
在第一种情况下,一个内存块将包含所有结构数据,包括完整数组。
在第二种情况下,你会在内存中找到你结构元素的地址,一个包含内存中数组实际地址的指针,所以你只能看到一个数字(指针的指向地址)