Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c编译器如何为结构分配内存?_C - Fatal编程技术网

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

c编译器如何为结构分配内存?,c,C,通过研究结构,我提出了一个问题,即编译器如何将结构存储在内存中,这意味着考虑 struct { int number; char name[nam]; }h; 我想知道的是如何存储成员(这里是number和name)(它们是按顺序存储还是随机存储,例如,如果number存储在address 2000中,而name存储在2990中)?内存是按顺序为结构成员分配的: +------------+------------------+-----+-----+-----+-

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

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

我想知道的是如何存储成员(这里是
number
name
)(它们是按顺序存储还是随机存储,例如,如果number存储在address 2000中,而
name
存储在2990中)?

内存是按顺序为结构成员分配的:

+------------+------------------+-----+-----+-----+-----+-----+-----+
|            |     ........     |     |     |     |     |     |     |
|            |                  |     |     |     |     |     |     |
+------------+--------+---------+-----+-----+-----+-----+-----+-----+
+            +        |       name[0]                             name[nam-1]
+------+-----+        |         +------------------+----------------+
       |              |                            |
       |              |                            |
       v              v                            v
    number         padding                      name[nam]

但是,与数组不同,为结构分配的内存可以打包,也可以不打包,即在任何成员分配的空间之后可能会有一些填充(但在第一个成员之前不允许有任何填充)。

您可以在以下内容中找到答案:

数据结构对齐是指在数据库中排列和访问数据的方式 计算机内存它由两个独立但相关的问题组成:数据 对齐和数据结构填充。当现代计算机读取 从或写入内存地址,它将以字大小执行此操作 块(例如,32位系统上的4字节块)。数据对齐方式 将数据放在内存偏移量等于某个字的倍数 大小,这会由于CPU的运行方式而提高系统的性能 处理内存。要对齐数据,可能需要插入一些 最后一个数据结构的结尾和 下一步的开始,即数据结构填充


字段将始终按照写入的顺序,但它们之间可能有空格。

数组可以以两种不同的方式存储。在您的结构中,如果其大小是恒定的,比如
char数组[42]
,或者,如果它们在编译时的大小未知,则使用
malloc
进行分配,并在结构中具有指向数组的指针

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


在第二种情况下,您将在内存中结构元素的地址处找到一个指针,该指针包含内存中数组的实际地址,因此您将只看到一个数字(指针的指向地址)

我在第一年的讲座中复制了这幅图像。我希望它有帮助(它应该):


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

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


因此,在您的示例中,字段
name
必须跟在字段
number
后面,但这两个字段之间可能添加了填充。
name
字段后面可能还有填充,用于确保这些结构的数组中的每个元素都适当对齐。

该代码不会编译。你是说
char-nam[]?严格来说,在运行应用程序时,结构的空间由加载程序和虚拟内存管理器分配。是否确实允许复制和发布图形@我认识一个人,他曾经为此付了很多钱@参考资料表明你不是在试图剽窃,但不会阻止你因侵犯他人版权而被起诉。我会把这幅画拿走@haccks@alk; 是 啊删除了那个。谢谢你的帮助。@alk我编辑了他的帖子,放了同样的图片,但是更小了。我要付多少钱?嗯…挑毛病,
sizeof(struct)>=∑sizeof(成员)
。什么是挑剔?:/'“挑刺”是“挑刺”的另一种书写方式,最初指的是从某人的头皮上寻找“刺”或“虱子卵”或“虱子幼虫”的过程,这是一个寻找需要移除的微小物体的艰苦过程。如今,它指的是发现小故障。《苹果字典》说,挑剔是“寻找小的或不重要的错误或错误,特别是为了不必要的批评”和“挑剔的错误发现”。