这是该程序输出的正确解释吗?

Sha*_*ain 5 c structure

#include<stdio.h>

int main()
{
    struct test
    {
        char c;
        int y;
        float r;
        double d;
    } t1; 
    printf("%d\n",sizeof(t1));
    return 0;
}   
Run Code Online (Sandbox Code Playgroud)

输出:24我的gcc 4.3.2 Ubuntu 12.04

输出:运行代码的 Ideone Link上的20

我的解释: 我认为24是对的.如果我错了,请纠正我?

  1. Char'c'将获得第一块.自己1个字节,后跟3个字节的填充.
  2. 整数'y'将采用第二块.(在这种情况下,不需要填充,因为整数是4字节.因此它将完全填充块).
  3. 浮动'r'将获得第3个块.(不需要填充,因为浮点数也是4个字节).
  4. 现在将填充4个字节的下一个块,因为下一个是双倍的.和存储地址必须是该数据类型的多个大小.
  5. 接下来2个4字节的块将被双变量占用.

从而 Size = 1(char) + 3(Padded in Char case) + 4(int) + 4(float) + 4(padded for Double) + 8(double) = 24

清晰度:

由于Chunks采用4字节采集.所以每个地址都是4的倍数.对于double,Next地址必须是1012.但它不是8的倍数.所以填充它!并从1016年开始 内存布局 我的问题 - 24是正确的,我的解释是正确的还是我的解释是错的,请解释一下?

The*_*kis 5

在特定编译器输出具有该结构的特定布局的二进制文件的意义上,您的解释是正确的.如果您已正确预测输出,那么您的预测显然对于您在此特定时间的特定设置是正确.

但是,无论如何,结构的大小都不用C严格定义的.在这个主题中唯一定义的是结构成员的顺序和第一个成员的偏移量.填充,因此,结构的总大小是未定义的,它留作编译器的决定.显然,编译器填充结构的主要原因是通过基于各个类型的成员的正确对齐来提高性能(正如您正确指出的那样).但是(这在这里很重要)编译器根据目标架构选择最有效的填充.例如,如果体系结构具有128位int,则可以想象结构的大小将如何根本不同.

因此,如果涉及C语言的定义方面(或除了您描述的任何设置之外),您的预测将毫无根据.它自然会匹配一些设置,但只是偶然.

  • C++ 11确实更准确地定义了对齐,但仍然对结构类型的`sizeof'绝对保证零(除了它必须是正数). (2认同)