为什么指针在这里被类型化为char?

时间:2015-02-09 09:06:59

标签: c pointers type-conversion

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

  1. 我无法理解这一步(char*)(p+1)-(char*)p) - 为什么指针被类型化为char。

  2. 我打印出每种数据类型的大小。所以,结构的大小应该是3 *大小的int +大小的浮点数+大小的char = 17.但是,结构的大小是20.请解释如何。

  3. 为什么(float*)(p+1)-(float*)p)的输出为5。

  4. 代码:

    #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));
    
    }
    

    输出:

      

    结构的大小w / o使用sizeof:20
      结构大小w / o使用sizeof:5
      使用sizeof的结构大小:20
      1 4 4 20

    4)谢谢你的回答。我还有一个疑问。

    struct sample
    {
    int a,b;
    float c;
    char z;
    int k;
    char s;
    };
    

    填充后,此结构的大小为24个字节。为什么在float (float)((float*)(p+1)-(float*)p)中打印它不会给出5.8000而不是6.

3 个答案:

答案 0 :(得分:2)

  1. 以字节为单位转换将为您提供两个指针之间的字节差异

  2. 您的结构获取填充以与4字节边界对齐。在您的结构中,真正的大小将如下(包括填充)

    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
    }
    
  3. 转换为float将为您提供浮点数中的sizeof结构(5个浮点数= 20个字节)

答案 1 :(得分:1)

  1. Typecasted to(char *)因为你想以char(字节)打印大小。当你递增p时,它将按p的大小递增。所以(p + 1)-p是结构的大小,(char *)帮助以字节为单位打印它。

  2. 了解结构对齐和填充

  3. 5因为这个时候它的类型为(float *),因为你想以float(4字节)为单位打印大小。当你递增p时,它将按p的大小递增。所以(p + 1)-p是结构的大小,(float *)帮助以浮点数(4个字节)打印它。

答案 2 :(得分:0)

  1. 即使(char*)(p+1) - (char*)p)承诺不使用sizeof *p,它也会隐式地这样做,因为指向p的指针乘以它们各自类型的大小......。 C99中提到了这一点:http://www.iso-9899.info/n1256.html#FOOTNOTE.91

  2. 许多cpu架构,包括intel x86系列处理器需要在一个地址上读取它们的多字节整数,这些整数可以被它们的大小整除,例如对于4字节类型,地址必须是均匀的这意味着,当你的struct创建一个数组时,即使你{{1},第二个元素的int必须可以被4整除最后。这就是为什么在那里添加填充并包含在结构的总大小中的原因。

  3. 此结果是结构的大小除以char类型的大小。因为我们现在知道你的struct的大小是20,float计算到p之后20个字节的地址,但是然后它被转换为p+1,它将偏移量除以适合的浮点数进入区间。

相关问题