首页 文章

为什么指针在这里被拼写为char?

提问于
浏览
0

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

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

  • 我打印出每种数据类型的大小 . 因此,结构的大小应该是3 *大小的浮点大小为char = 17的int大小 . 但是,结构的大小是20.请解释如何 .

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

Code:

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

}

Output:

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

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

code

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
    • Typecasted to(char *)因为你想以char(字节)打印大小 . 当你递增p时,它将按p的大小递增 . 所以(p 1)-p是结构的大小,(char *)帮助以字节为单位打印它 .

    • 了解结构对齐和填充

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

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

    • 您的结构获取填充以与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
    }
    
    • 转换为float将为您提供浮点数中的sizeof结构(5个浮点数= 20个字节)
  • 2
    • 即使 (char*)(p+1) - (char*)p) 承诺不使用 sizeof *p ,它也会隐式地这样做,因为指向p的指针乘以它们各自类型的大小...... . 这在C99中提到:http://www.iso-9899.info/n1256.html#FOOTNOTE.91

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

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

相关问题