mm等于毫米 2024-02-27 22:02 采纳率: 25%
浏览 0

求解结构体偏移量问题!

为什么n1和n2的值不一样?不应该都为64吗?


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct
{
    char name[64];
    int age;
    int id;
}Teacher;

int main(void)
{
    Teacher t1;
    printf("%d\n", sizeof(Teacher));
    Teacher* p = NULL;
    p = &t1;
    int n1 = (int)((&p->age) - p);
    //printf("%p, %d\n", p, (int)p);
    //printf("%p, %d\n", &p->age,(int)&p->age);
    int n2 = (int)(&p->age) - (int)p;//相对于结构体首地址
    printf("n1 = %d\n", n1);
        printf("n2 = %d\n", n2);

    return 0;
}
  • 写回答

4条回答 默认 最新

  • GISer Liu 2024-02-27 22:03
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    问题分析:

    1. 为什么n1和n2的值不一样?
    2. 不应该都为64吗?
      解决思路与方案:
    3. n1和n2的值不同的原因是由于在计算偏移量时,采用的是不同的方式。n1是通过计算指针地址与成员地址之差得到的,而n2是直接计算成员地址相对于结构体首地址的偏移量。
    4. 实际上,n1和n2都应该是相同的,因为结构体中的name数组大小为64,而age和id各占用4个字节的空间,因此按照内存对齐规则,结构体的总大小应该是64 + 4 + 4 = 72字节。
      针对以上问题,可以进行如下修改和说明:
      cCopy code
      #include<stdio.h>
      #include<stdlib.h>
      #include<string.h>
      typedef struct {
      char name[64];
      int age;
      int id;
      } Teacher;
      int main(void) {
      Teacher t1;
      printf("%d\n", sizeof(Teacher));
      Teacher* p = NULL;
      p = &t1;
      int n1 = (int)((&p->age) - p); // 使用指针地址与成员地址之差计算偏移量
      int n2 = (int)((char*)&p->age - (char*)p); // 使用成员地址相对于结构体首地址的偏移量
      printf("n1 = %d\n", n1);
      printf("n2 = %d\n", n2);
      return 0;
      }
      
      在这个修改中,我们在计算n2的时候,将指针类型转换为char指针,这样就可以按字节来计算偏移量,以确保得到的结果是正确的结构体成员偏移量。

    如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订

    用户答题指南

    评论

报告相同问题?

问题事件

  • 创建了问题 2月27日

悬赏问题

  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图
  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变
  • ¥15 python螺旋图像
  • ¥15 算能的sail库的运用
  • ¥15 'Content-Type': 'application/x-www-form-urlencoded' 请教 这种post请求参数,该如何填写??重点是下面那个冒号啊
  • ¥15 找代写python里的jango设计在线书店
  • ¥15 请教如何关于Msg文件解析
  • ¥200 sqlite3数据库设置用户名和密码
  • ¥15 AutoDL无法使用docker install吗?