结构体,函数,类偏移量

news/2024/7/20 14:12:11 标签: 指针, c++, 内存管理

1.结构体偏移量

struct Test{
	int a;//4byte
	int b;//4byte
	int c;
	int d;
	}
	//a->d 低到高

//这俩在内存中的结构是一样的
Test test;
int  arrtest[4];
//
int Test::*memoffset=&Test::a;
cout<<"Show the offset"<<endl;
printf("a's offset %u \n",memoffset);//对照test的起始地址偏移0位
memoffset=&Test::b;
printf("b's offset %u \n",memoffset);//4
memoffset=&Test::c;
printf("c's offset %u \n",memoffset);//8
memoffset=&Test::d;
printf("d's offset %u \n",memoffset);//12

//我们通常使用点语法访问a
int t=test.a;
//但是当我们知道内存布局偏移后就可以使用指针访问
int *membegin=(int *)&test;
//点语法和int b指针取法在机器码下完全一样
test.b=110;
int b=*(membegin+1);//以membegin的类型int长度为基数单位,所以+1
printf("b is %d",b);

//演示一下怎么一样
int *pointer=&arrtest[0];//pointer指向arrtest的首地址
//将arrtesst的首地址给了testarr
Test* testarr=(Test*)pointer;//强行将pointer转换成test
testarr->a=1;
testarr->b=2;
printf("a is %d,b is %d",arrtest[0],arrtest[1]);

//接下来顺路解释下联合体union
size_t offset=(size_t)memoffset;//无法转换
//使用union可以
union{
	size_t offset;
	int Test::* offsetT;
	}offsetu;
offsetu.offsetT=&Test::a;
size_t offsetA=offsetu.offset;
printf("offsetA is %u ",offsetA);



http://www.niftyadmin.cn/n/1531681.html

相关文章

Select模型处理多客户端

阻塞模式&#xff08;旧&#xff09; Select模式 select的作用就是&#xff0c;让客户端或者服务端&#xff0c;只在有数据传输的时候&#xff0c;进行数据传输操作&#xff0c;当没有数据传输任务的时候&#xff0c;他们可以在本地进行其他任务处理。 例如&#xff1a;QQ发消…

Select模型处理多客户端(timeval非阻塞类型)

我们现在需要第五个参数去&#xff0c;让select不在一直阻塞服务器进度 所以先让我们看一下select模型 第五个参数的类型为timeval&#xff0c;所以我们先要定义一个timeval指针对象。 服务端添加了 1.使用vector容器&#xff0c;向所有客户端发送&#xff0c;其他客户端的登…

C++ socket Recv()函数

int processor(SOCKET _clientSock) {//第一次接受一个缓冲数据char szRecv[1024] {};//5.接收客户端数据//第一次收了header的数据包&#xff0c;只剩下CMD的数据长度&#xff0c;指针移动到数据包包体位置//这里szRECV被接收到了有DataHeader的长度。数据仍在recv中储存&…

关于OpenCV与OpenCV_Contrib

今天想跑个代码发现安装了windows的OpenCV竟然还缺少库&#xff0c;在链接库当中&#xff0c;尝试了在属性附加依赖项当中取消从父级或者项目默认中继承和手动添加继承值的库&#xff08;把opencv_aruco341修改添加到附加依赖项中&#xff09;&#xff0c;这两个操作依然无效。…

封装Client

1.什么是数据封装 将client视为一个对象&#xff0c;他有初始化&#xff0c;登录&#xff0c;登出等属性功能。 将client写成一个类&#xff0c;这个类中的每一个函数都实现一个功能。 就是封装client 以后外部使用client&#xff0c;只需要调用client类创建对象就可以了。 Ea…

y9000x Ubuntu 16.04 网卡问题 以及升级内核问题

1.y9000x网卡问题 https://blog.csdn.net/zsyf33078/article/details/105319368 2.升级内核问题 在升级内核linux-headers-5.7.1-050701_5.7.1-050701.202006071230_all.deb 文件的时候说缺少libssl1.1问题 https://blog.csdn.net/z952957407/article/details/99690571 3.i91…

Ubuntu 如何把.sh 文件添加快速启动

1.gedit ~/.bashrc 2.在bashrc中, export PATH软件.sh的绝对路径的上一层&#xff0c;一般是bin文件:PATHexportPATH/home/Test/bin:{PATH} export PATH/home/Test/bin:PATHexportPATH/home/Test/bin:{PATH} 3.source ~/.bashrc Ubuntu16.04 问题&#xff1a;Command ‘ls’ i…