6

我的代码出现异常行为,如下所示

#include<stdio.h>
struct a
{
    int x;
    char y;
};
int main()
{   
   struct a str;
   str.x=2;
   str.y='s';
   printf("%d %d %d",sizeof(int),sizeof(char),sizeof(str));
   getch();
   return 0;
}

对于这段代码,我得到了输出:

4 1 8

据我所知,该结构包含一个大小为 4 的整数变量和一个大小为 1 的 char 变量,因此结构 a 的大小应该是 5。但是结构的大小怎么是 8。我正在使用 Visual C++ 编译器。为什么会有这种行为?

4

3 回答 3

12

它被称为结构填充

在内存中以及在 RAM 和 CPU 之间移动数据时,具有以 4 字节字对齐开始的数据结构(在具有 4 字节总线和处理器的 CPU 上)要高效得多。

您通常可以使用编译器选项和/或编译指示将其关闭,这样做的细节将取决于您的特定编译器。

希望这可以帮助。

于 2012-04-26T11:53:36.447 回答
8

编译器插入填充以进行优化和对齐。在这里,编译器在两个成员之间(或之后)插入 3 个虚拟字节。

#pragma您可以使用指令处理对齐。

于 2012-04-26T11:50:52.903 回答
0

主要是为了说明这种填充实际上是如何工作的,我对您的程序进行了一些修改。

#include<stdio.h>
struct a
{
  int x;
  char y;
  int z;
};
int main()
{   
   struct a str;
   str.x=2;
   str.y='s';
   str.z = 13;

   printf ( "sizeof(int) = %lu\n", sizeof(int));
   printf ( "sizeof(char) = %lu\n", sizeof(char));
   printf ( "sizeof(str) = %lu\n", sizeof(str));

   printf ( "address of str.x = %p\n", &str.x );
   printf ( "address of str.y = %p\n", &str.y );
   printf ( "address of str.z = %p\n", &str.z );

   return 0;
}

请注意,我在结构中添加了第三个元素。当我运行这个程序时,我得到:

amrith@amrith-vbox:~/so$ ./padding 
sizeof(int) = 4
sizeof(char) = 1
sizeof(str) = 12
address of str.x = 0x7fffc962e070
address of str.y = 0x7fffc962e074
address of str.z = 0x7fffc962e078
amrith@amrith-vbox:~/so$

下面突出显示了说明填充的部分。

address of str.y = 0x7fffc962e074
address of str.z = 0x7fffc962e078

虽然 y 只是一个字符,但请注意 z 是一个完整的 4 个字节。

于 2013-08-15T10:58:53.900 回答