当前位置: 首页 > news >正文

C(结构体指针、利用结构体指针偏移获取数据)

记录问题,还没有研究明白

struct MY_STRUCT{int a;short b;char s[100];double d;
};
int main(){   MY_STRUCT s={1,2,"he",999};MY_STRUCT* struct_ptr =&s;char *char_p =(char *) &s.s;int *int_ap = &s.a;short * int_bp = &s.b;double * int_dp = &s.d;qDebug()<<"sizeof(my_struct)" <<sizeof (MY_STRUCT);qDebug()<<"char_p = "<<char_p;qDebug()<<"a = "<<*int_ap;qDebug()<<"int_ap 的地址"<<int_ap; // +4是b的地址  + 108是d的地址  +8是s的地址   ,内存排序不会安装结构体顺序来qDebug()<<"int bp 的地址"<<int_bp;qDebug()<<"char的地址"<<&char_p; //和ap相差24个字节,因为内存对其的原因,按照结构体中字节最大的数据的整数倍补齐qDebug()<<"int_dp 的地址"<<int_dp;qDebug()<<"struct的地址"<<struct_ptr; // 7993840qDebug()<<"struct的地址+1"<<struct_ptr+1;// 7993960    相差120个字节,证明按照结构体指针的大小不是4、8,而是实际结构的大小qDebug()<<"1 = "<< *((int*)struct_ptr);qDebug()<< "2 = "<<*((short*)(struct_ptr+4)) ; //可以取到第二个元素 好像不对? 指针+1是按照指针的大小+1qDebug()<< "2= "<<*((short *)(char *)struct_ptr+2);
//        qDebug()<<"3 ="<< ((char *)struct_ptr+1)  ; //可以取到第三个元素  104  108   116
//        qDebug()<<"3 ="<< *((double *)(char *)struct_ptr+112) ; //可以取到第三个元素  104  108   116}

最后一部分的偏移还在找规律

qDebug()<<"struct的地址"<<struct_ptr; // 7993840qDebug()<<"struct的地址+1"<<struct_ptr+1;// 7993960    相差120个字节,证明按照结构体指针的大小不是4、8,而是实际结构的大小qDebug()<<"1 = "<< *((int*)struct_ptr);
//    qDebug()<< "2 = "<<*((short*)(struct_ptr+4)) ; //可以取到第二个元素 好像不对? 指针+1是按照指针的大小+1
//    qDebug()<< "2= "<<*((short *)(char *)struct_ptr+2);qDebug()<<"2 ="<< *(short *)(((char*)struct_ptr)+4) ;qDebug()<<"3 ="<< (char *)(((char *)struct_ptr)+6); //可以先找地址在获取值qDebug()<<"4 ="<< *(double *)(((char*)struct_ptr)+16) ;//15偏移24   5偏移16

打印字符数组每个字节的地址

char a[4] = {'i','c','e','\0'};for(int i = 0; i < 3; ++i){qDebug()<<(void*)a[i] <<" "<<&a[i]<<" " << a[i]; //第一个取到是字符常量的地址qDebug()<< (void*)&a[i] ; //获取到指针的地址}

http://www.lryc.cn/news/160030.html

相关文章:

  • 数据结构和算法之插入排序
  • 感应电动机
  • AjaxJavaScriptcss模仿百度一下模糊查询功能
  • sqli-labs复现
  • k8s入门到实战--跨服务调用
  • 小程序中使用分包
  • python官方标准库
  • Python Opencv实践 - 霍夫圆检测(Hough Circles)
  • 异步请求库的实际应用案例:爬取豆瓣经典电影
  • 数据结构学习系列之两个单向链表的合并
  • java网络编程,套接字socket
  • 一日一技:Python如何同时调用多个GPT的API?
  • 【云原生】Docker环境安装
  • 56、springboot ------ RESTful服务及RESTful接口设计
  • sysmonitor如何使用
  • 视频监控/视频汇聚/安防视频监控平台EasyCVR如何将默认快照的raw格式改为jpg/base64格式?
  • QRCode.js生成的二维码水平居中的解决方案
  • 在Cisco设备上配置接口速度和双工
  • 增益带宽积GBW
  • 二分搜索树节点的查找(Java 实例代码)
  • 2.9 PE结构:重建导入表结构
  • MybatisPlus插件功能详细介绍 自动分页 通用分页实体
  • ES kibana 创建索引快速脚本
  • 2023年09月编程语言流行度排名
  • linux对一个文件夹中的所有文件重命名
  • Greenplum执行SQL卡住的问题
  • Discourse 的系统日志
  • 【7z密码】如何给7z压缩包加密、解密?
  • InnoDB为什么使用B+Tree
  • 【Spring Bean的生命周期实现方式】