当我们使用pragma pack(1)时会发生什么?

时间:2014-07-04 02:51:42

标签: c

#include <stdio.h>
#pragma pack(1)

typedef struct 
{
  char name[10];
  int age;
  int class;
  char grade;
}stud_s;

int main(void)
{
  stud_s s1= {"john" ,10, 10, 'A'};
  printf("%ld \n",sizeof(stud_s));
  return 0;
}

在上面的结构中,名称保留10个字节。名称“john”是4个字节,因此当我使用#pragma时,结构的大小应该是13.而不是大小导致19个字节。谁能看看我的代码?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

你对pragma pack的作用感到有些困惑。它不关心特定的实例化,而是关于元素之间的填充。

让我们看一个更简单的对象:

struct obj {
    uint64_t x;
    uint32_t y;
};

通常,此对象将采用 16字节。如果您使用pragma pack(1),则只会使用 12字节

答案 1 :(得分:0)

在C中,无法定义包含数组的结构,该数组的大小取决于初始化程序的内容。您可以使用C99灵活数组成员,但是您必须使用malloc分配结构。

在C ++中,您可以使用模板和继承做一些聪明的事情,但是name成员不会成为基类型的一部分,这会很不方便。

#pragma pack两种情况都没有帮助。该公共扩展仅删除结构字段之间的填充