C结构填充

标签 c

我可以在各种编译器上使用 pragma pack 来强制结构具有不在其自然对齐方式上的字段。

这是递归的吗 - 所以假设 struct typedef A 包含 typedef struct B 的字段。如果使用 pragma 来打包 A,这会强制打包 struct B 吗?

最佳答案

你必须希望不会!假设您有一个接受参数结构 A 的函数:

void fn( struct A x ) ;

然后是一个包含结构 A 作为成员的压缩结构 B:

#pragma pack(1)
struct B
{
    struct A a ; 
}

如果您将 B 的成员 a 传递给 fn(),则该函数不知道该实例中的打包,并且会失败。

尽管有其他回答者的结果,我还是在 VC++ 2010 上执行了以下测试:

struct A
{
    int a;
    char b;
    int c ;
} ;

struct B
{
    struct A  d ;
} ;

#pragma pack(1)
struct C
{
    struct A  d ;
} ;


#pragma pack(1)
struct D
{
    int a;
    char b;
    int c ;
} ;

#pragma pack(1)
struct E
{
    struct D ;
} ;

int main()
{
    int a = sizeof(struct A) ;
    int b = sizeof(struct B) ;
    int c = sizeof(struct C) ;
    int d = sizeof(struct D) ;
    int e = sizeof(struct E) ;
}

在调试器中检查 main() 中的 a、b、c、d 和 e:

  • a = 12
  • b = 12
  • c = 12
  • d = 9
  • e = 9

struct C 的打包对其 struct A 成员的大小没有影响。

关于C结构填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4128061/

相关文章:

mysql - 通过SSH连接mysql错误2002

c++ - 如何在 C++ 中为卡片制作 ASCII 边框并制作 10 不移动它们

c - 如何在 C 中创建静态库?

iphone - 如何在 iPhone 应用程序中使用 FLAC?

c - 结构链表 - 如何编辑数据

c - 函数调用的评估顺序

c - Makefile - 在单独的文件中包含路径

c - scanf - 多个整数

c - C中的十六进制值除法

c - 三问 : Is NULL - NULL defined? (uintptr_t)NULL - (uintptr_t)NULL 定义了吗?