float和int的内存表示

时间:2011-08-29 17:20:56

标签: c floating-point integer

struct s
{
  int a;
  float b;
  int c;
}

这个结构成员如何存储在内存位置? 我的理解是,当一个结构变量被分配然后内存为 结构成员也将被分配。如果1000是起始地址,那么a将是 1000,b为1004,c为1008。

整数和浮点数将在内存中具有不同的地址空间。如何漂浮和 在内存中表示的结构内声明的整数?请帮帮我 理解。

4 个答案:

答案 0 :(得分:3)

假设sizeof(int) == sizeof(float) == 4并且编译器没有决定放入一些填充,你的答案是正确的。我不知道“整数和浮点数在内存中会有不同的地址空间”是什么意思,所以我不确定我能回答你的最后一个问题。

答案 1 :(得分:2)

  

这个结构成员如何存储在内存位置?我的理解是,当分配结构变量时,也将分配结构成员的内存。如果1000是起始地址,那么a将是1000 b将是1004.will c将是1008。

由于int和even float的大小是特定于平台的,因为结构在内存中的打包/存储/对齐/检索方式,对你的问题没有平台中立的答案。

如果结果存储在内存中对你来说很重要,那么你必须研究一些特定于编译器的方法,以确保结构被正确打包和对齐。对于gcc,请参阅here了解如何使用__attribute__来控制打包和对齐。对于MSVC,请参阅here了解如何使用pragma pack

当然这里是DRAGONS:

你正在探索数据存储在内存中的特定于平台的方式,如果你把这大块内存并将其发送到另一台设备,那么就会有很多机会出现错误。为了防止错误(并且会有错误),请记住:

  • Endianess
  • 如果您正在转换为另一种类型的指针(即类型 - 打孔或别名),请注意C99将不支持指针别名。请参阅strict aliasing rule

答案 2 :(得分:2)

说结构的成员与结构同时分配并不是真正有意义的。结构只是其成员的集合。结构中没有其他数据可以有意义地说“结构已分配但不是成员”。

究竟如何分配内存取决于平台和编译器。例如,如果int和float都是4个字节 - 我认为这是典型的 - 那么这个结构将包含12个字节,这三个字段是一个接一个的。

编译器有时会将结构中的所有字段放在4字节边界或其他边界上。因此,如果你有一个由char,float和int组成的结构,你可能得到1个字节的char,3个填充字节,然后4个用于浮点数,4个用于int。

整数和浮点数在内存中没有不同的地址空间,至少在我曾经使用的任何系统上都没有。他们自由地混在一起。处理器可能有单独的int和float寄存器,但这是完全不同的事情。

答案 3 :(得分:0)

您可以使用offsetof宏来获取结构成员偏移量。将此偏移量添加到结构地址以获取成员的地址。

typedef struct s {
  int a;
  float b;
  int c;
} s_t;

s_t var;

printf("var.c addresss=%p\n",((const uint8_t*)&var)+offsetof(s_t,c));
相关问题