在 C 语言中,我们分配结构体成员的顺序是否与值存储在内存中的位置有关?

问题描述 投票:0回答:1
假设我有一个结构,foo。

struct foo { int x; int y; int z; };
如果我为这个结构体分配12字节的内存
我的理解是将为该结构分配一块内存,
如果我先设置x的值,那么内存的前4个字节会转到x吗?

编译器如何知道结构体块中 x、y 和 z 的位置

c memory-management
1个回答
0
投票
是的,成员的地址是按声明顺序定义的。一个特殊的例外是位字段,其打包和排序是实现定义的。

来自语言标准当前草案 n3047(

参考

6.7.2.1 结构和联合说明符:

...

    在结构体对象中,非位域成员和单位 哪些位域所在的地址按顺序递增 他们是这样宣布的。适当地,指向结构对象的指针 转换后,指向其初始成员(或者如果该成员是 位字段,然后到它所在的单元),反之亦然。 结构对象内可能有未命名的填充,但在其内部则不然 开始。
实际上,其成员的位置通常保持为基地址的“偏移”。因此,假设“正常”条件(没有特殊的对齐或填充规则)和 4 字节的

int,则 x

 的偏移量(以字节为单位)为 0,
y
 为 4,
z
 为 8。 
备注:

您不应该
    为单个
  1. struct foo

    对象分配“12个字节”,而应该分配sizeof struct foo字节。您不能保证

    sizeof int
    为 4,也不能保证某些其他结构对齐要求有效。
    
    

    int
  2. 的大小是实现定义的。如果您
  3. 需要

    32 位有符号整数,请使用

    int32_t
    中的 <ctype.h> 来代替。
    
    
        

© www.soinside.com 2019 - 2024. All rights reserved.