代码之家  ›  专栏  ›  技术社区  ›  Abdus Sattar Bhuiyan

在C程序中,如何为结构和联合分配内存?[副本]

c
  •  -1
  • Abdus Sattar Bhuiyan  · 技术社区  · 6 年前

    在结构中,将为结构中的所有成员创建内存空间。 只为需要最大内存空间的成员创建联合内存空间。 请考虑以下代码:

    struct s_tag
    {
       int a;
       long int b;
    } x;
    
    struct s_tag
    {
       int a;
       long int b;
    } x;
    
    union u_tag
    {
       int a;
       long int b;
    } y;
    
    union u_tag
    {
       int a;
       long int b;
    } y;
    

    在struct和union中有两个成员:int和long int。

    因此,对于struct 4+8=12字节将被创建,而对于union将创建8字节。我运行以下代码以查看证据: C类

    #include<stdio.h>
    struct s_tag
    {
      int a;
      long int b;
    } x;
    union u_tag
    {
         int a;
         long int b;
    } y;
    int main()
    {
        printf("Memory allocation for structure = %d", sizeof(x));
        printf("\nMemory allocation for union = %d", sizeof(y));
        return 0;
    }
    

    但我可以看到以下输出:

    Memory allocation for structure = 16
    Memory allocation for union = 8
    

    为什么struct的内存分配是16而不是12?我的理解有错吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   LoztInSpace    6 年前

    很可能是在x字节边界上对齐内存访问的要求。另外,这取决于编译器-它可以做它喜欢的事情。

        2
  •  0
  •   Erlkoenig    6 年前

    编译器在两个结构成员之间添加不可见的填充字节,以确保 long 成员是的倍数 sizeof(long) ,以便变量在内存中正确对齐。根据CPU体系结构的不同,如果变量没有正确对齐,对它的访问可能会导致程序崩溃,导致错误的值,只是速度慢或按预期工作。