c编译器如何为结构分配内存?

时间:2013-12-19 15:39:46

标签: c

通过研究结构引出了一个问题,即结构如何通过编译器存储在内存中,这意味着要考虑

struct 
{
      int number;
      char name[nam];
 }h;

我想知道的是如何存储成员(这里是numbername)(无论它们是按顺序存储还是存储在随机位置,例如,如果数字存储在地址中2000和name存储在2990)?

6 个答案:

答案 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)

我在第一年的演讲中复制了这张图片。我希望它有所帮助(它应该):

enter image description here

答案 4 :(得分:2)

来自C99 6.7.2.1/13结构和联合说明符

  

在结构对象中,非位字段成员和单位   哪些位字段驻留的地址按顺序增加   他们被宣布。适当地指向结构对象的指针   转换后,指向其初始成员(或者如果该成员是   位字段,然后到它所在的单元,反之亦然。   结构对象中可能有未命名的填充,但不在其中   开始。

因此,字段name必须遵循示例中的字段number,但可能会在两个字段之间添加填充。在name字段之后也可能有填充,用于确保这些结构的数组将使每个元素适当对齐。

答案 5 :(得分:-1)

阵列可以以两种不同的方式存储。在你的结构中,如果它的大小是常量,如char array[42],或者,如果它们在编译时具有未知大小,则使用malloc分配,并在结构中有一个指向数组的指针。

在第一种情况下,一个内存块将包含所有结构数据,包括完整数组。

在第二种情况下,你会在内存中找到你结构元素的地址,一个包含内存中数组实际地址的指针,所以你只能看到一个数字(指针的指向地址)

相关问题