C 为什么指针在这里被键入字符?

C 为什么指针在这里被键入字符?,c,pointers,type-conversion,C,Pointers,Type Conversion,我通过这个程序来查找结构的长度,而不使用sizeof。我有些问题找不到答案 我无法理解这一步(char*)(p+1)-(char*)p)-指针被类型转换为char的原因 我打印出了每个数据类型的大小。因此,结构的大小应该是3*size of int+size of float+size of char=17。但是,结构的大小是20。请解释一下 为什么(float*)(p+1)-(float*)p)的输出为5 代码: #include<stdio.h> struct sample {

我通过这个程序来查找结构的长度,而不使用sizeof。我有些问题找不到答案

  • 我无法理解这一步
    (char*)(p+1)-(char*)p)
    -指针被类型转换为char的原因

  • 我打印出了每个数据类型的大小。因此,结构的大小应该是3*size of int+size of float+size of char=17。但是,结构的大小是20。请解释一下

  • 为什么
    (float*)(p+1)-(float*)p)
    的输出为5

  • 代码:

    #include<stdio.h>
    
    struct sample
    {
        int a,b;
        float c;
        char z;
        int k;
    };
    
    void main()
    {
        struct sample *p;
        struct sample x;
        printf("size of struct w/o using sizeof: %d\n", (char*)(p+1)-(char*)p);
    
        printf("size of struct w/o using sizeof: %d\n", (float*)(p+1)-(float*)p);
    
        printf("size of struct using sizeof: %d\n", sizeof(struct sample));
    
        printf(" %d %d %d %d\n", sizeof(char), sizeof(int), sizeof(float), sizeof(x));
    
    }
    
    填充后,此结构的大小将为24字节。为什么在float
    (float)((float*)(p+1)-(float*)p)
    中打印此项不会得到5.8000而不是6

  • 以字节为单位进行转换将得到两个指针之间的字节差异

  • 您的结构将填充与4字节边界对齐。在您的结构中,实际大小如下(包括填充)

  • 转换为float将得到float中的sizeof结构(5个float=20字节)

  • 以字节为单位进行转换将得到两个指针之间的字节差异

  • 您的结构将填充与4字节边界对齐。在您的结构中,实际大小如下(包括填充)

  • 转换为float将得到float中的sizeof结构(5个float=20字节)

  • 以字节为单位进行转换将得到两个指针之间的字节差异

  • 您的结构将填充与4字节边界对齐。在您的结构中,实际大小如下(包括填充)

  • 转换为float将得到float中的sizeof结构(5个float=20字节)

  • 以字节为单位进行转换将得到两个指针之间的字节差异

  • 您的结构将填充与4字节边界对齐。在您的结构中,实际大小如下(包括填充)

  • 转换为float将得到float中的sizeof结构(5个float=20字节)

  • 类型转换为(字符*),因为您要以字符(字节)为单位打印大小。当你增加p时,它会增加p的大小。(p+1)-p是结构的大小,(char*)有助于以字节为单位打印它

  • 阅读有关结构对齐和填充的信息

  • 5因为这一次它的类型转换为(float*),因为您希望以float(4字节)为单位打印大小。当你增加p时,它会增加p的大小。所以(p+1)-p是结构的大小,(float*)有助于以浮点数(4字节)打印它

  • 类型转换为(字符*),因为您要以字符(字节)为单位打印大小。当你增加p时,它会增加p的大小。(p+1)-p是结构的大小,(char*)有助于以字节为单位打印它

  • 阅读有关结构对齐和填充的信息

  • 5因为这一次它的类型转换为(float*),因为您希望以float(4字节)为单位打印大小。当你增加p时,它会增加p的大小。所以(p+1)-p是结构的大小,(float*)有助于以浮点数(4字节)打印它

  • 类型转换为(字符*),因为您要以字符(字节)为单位打印大小。当你增加p时,它会增加p的大小。(p+1)-p是结构的大小,(char*)有助于以字节为单位打印它

  • 阅读有关结构对齐和填充的信息

  • 5因为这一次它的类型转换为(float*),因为您希望以float(4字节)为单位打印大小。当你增加p时,它会增加p的大小。所以(p+1)-p是结构的大小,(float*)有助于以浮点数(4字节)打印它

  • 类型转换为(字符*),因为您要以字符(字节)为单位打印大小。当你增加p时,它会增加p的大小。(p+1)-p是结构的大小,(char*)有助于以字节为单位打印它

  • 阅读有关结构对齐和填充的信息

  • 5因为这一次它的类型转换为(float*),因为您希望以float(4字节)为单位打印大小。当你增加p时,它会增加p的大小。所以(p+1)-p是结构的大小,(float*)有助于以浮点数(4字节)打印它

  • 即使
    (char*)(p+1)-(char*)p)
    承诺不使用
    sizeof*p
    ,它也会隐式地这样做,因为指向p的指针会乘以大小。。。它们各自的类型。C99中提到了这一点:

  • 许多cpu体系结构,包括intel
    x86
    系列处理器,都需要在可被其大小均匀整除的地址读取多字节整数,例如,对于4字节类型,地址必须可被4均匀整除。这意味着,当为
    结构创建数组时,第二个元素的
    int
    s也必须可以被4整除,即使
    char
    位于末尾。这就是为什么在那里添加了填充并包含在结构的总大小中

  • 这个结果是结构的大小除以您的
    float
    类型的大小。因为我们现在知道结构的大小是20,
    p+1
    的计算结果是p后面20个字节的地址,但随后它被转换为
    float*
    ,它将偏移量除以适合间隔的浮点数

  • 即使
    (char*)(p+1)-(char*)p)
    承诺不使用
    sizeof*p
    ,它也会隐式地这样做,因为指向p的指针会乘以大小。。。它们各自的类型。C99中提到了这一点:

  • 许多cpu体系结构,包括intel
    x86
    系列处理器,都需要读取地址为d的多字节整数
    struct sample
    {
    int a,b;
    float c;
    char z;
    int k;
    char s;
    };
    
    struct sample
    {
         int a,b; // 8 bytes, 4 bytes each
         float c; // 4 bytes
         char d; // 4 bytes, 1 byte + 3 padding
         int k; // 4 bytes
    }