它将在 DEV c++ 编译器上给出输出 28 我期望 26 考虑 float 为 4 字节 int 为 4 字节,char 为 1 字节 [重复]

Posted

技术标签:

【中文标题】它将在 DEV c++ 编译器上给出输出 28 我期望 26 考虑 float 为 4 字节 int 为 4 字节,char 为 1 字节 [重复]【英文标题】:It will give the output 28 on DEV c++ compiler I am expecting 26 considering float as 4 byte int as 4 byte and char as 1 byte [duplicate] 【发布时间】:2016-03-16 23:51:11 【问题描述】:
struct

    int m,s,l;
    union
    
        char c[10];
    ;
    float p;
 a;

int main()

    printf("%d",sizeof(a));
    return 0;

根据计算 ans 必须是 4*3+10+4=26 但 DEV C++ 编译器显示输出 28。

【问题讨论】:

请重新编辑:没问题,损坏的代码格式,作为单个元素联合的明显奇怪的细节。 【参考方案1】:

所有系统在栈上分配局部变量的原则大致相同

1 -- 堆栈从高地址向低地址增长

2 -- 变量在程序中的声明顺序对应堆栈的增长

3 -- 每种类型都有对齐方式 - 任何变量的地址都必须能被它的大小整除(1 表示 char,2 表示简称等)。尽量少浪费空间

这样,我们尝试利用一些浪费的空间来提高内存访问的速度。 所以在你的代码中,它意味着

#include <stdio.h>
#include <stdlib.h>

struct                   //  the base address is &a

    int         m;       // [0, 4)  
    int         s;       // [4, 8)
    int         l;       // [8, 12)
    union
    
        char    c[10];   // [12, 22)
    ;
    // char     m_align[2]  //  there are 4 byte for align
    float       p;       // [24, 28)
a;                      //  sizeof = 28

m的值是a类型的开头,在32位系统中占用4个字节,所以它的地址是[0, 4)。并且它的起始地址可以被sizeof(int)整除。

这与sl 相同。

然后是联合值c[10] occupancy,occupancy [12, 22),它的起始地址 12 可以被 sizeof(int) 整除。

下一个地址是22,值p会占用sizeof(float) = 4字节,但是地址22不能被sizeof(float)整除。我们必须填充空间以对齐结构并尝试浪费尽可能少的空间。所以p的基地址是24,可以被sizeof(float)整除,所以p的地址是[24, 28]...

你可以看到这个https://en.wikipedia.org/wiki/Data_structure_alignment了解详情

【讨论】:

【参考方案2】:

结构中的成员在 32 位处理器中排列为一组 4 个字节。所以你得到 28 个字节的大小。 更多详情见here 这是由于填充

【讨论】:

以上是关于它将在 DEV c++ 编译器上给出输出 28 我期望 26 考虑 float 为 4 字节 int 为 4 字节,char 为 1 字节 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

C++ char 数组 - 相同的输入给出不同的输出

C++:如何在 Windows 10 上使用编译器 MinGW 9.2.0 安装 OpenCV

Embarcadero Dev C++ 中文输出乱码

Dev-C++和xcode编译器的不同输出[重复]

Dev C++为啥不支持以void main()为主函数的空函数C程序?老师给出的一直都是以Tu

Dev C++ 提供一个输出,但 Visual Studio 代码为相同代码提供另一个输出