指针类型强转——结构体收发乱码问题复盘(二)

背景

最近工作中遇到一个问题,在job1中给一个结构体中赋值,把这个结构体给发送给job2,发现job1中看的结构体内部每个值的内容,到job2中后,就都错了,排查了很长时间也不得其解,后再大神的指点下,发现是结构体字节对齐这出的错,特此记录

指针类型基础:地址,字节,位

看网上对地址的记忆打的比方特别好,引用一下人家的精华(原文链接见文末),说内存就好比是一个摩天大楼,大楼高啊,特别特别高,大楼每一层,就是一字节(Byte),一层呢包含八间房子(这里可以做个联想,一层开8间,并且,类比内存的摩天大楼,是本着一层一户的原则来安排入住的数据的,一套8间的户型,简直不要太豪了!联想到现在炙手可热的字节跳动,怪不得以”字节“为公司名字,寓意也是豪的很啊!),每一间房子即对应了一位bit(对应了1Byte = 8bit),每一层都是有楼层编号的,这个楼层编号就是地址,指针变量所存的就是这个地址了。

比如,一个int类型的变量,创建的时候,是4字节,也就相当于占了4层楼,从下往上数,所占的第一层的楼层编号就是人家的地址了,当需要通过地址去访问人家粗放的int类型的变量数据的时候,会先通过地址,找到正确的位置,然后分析其数据类型,也就是Int类型,4字节,即占了四层的楼高,最后,从地址寻到的楼层开始,往上数四层,把这四层所存的数据都取出来,再按Int类型解析,得到的,就是所存的变量了。

数据类型与指针的关系

1,充当”偏移值“:上面点明了,在通过指针去访问数据变量的时候,数据类型充当的一个角色就是计算从首地址到末地址的”楼高,要访问的楼层数“(”偏移值“),根据数据类型对应的字节长度来访问数据。

2,充当解析向导:所访问到的数据无非都是0或1的码流,到底该转换成什么类型,才是访问者需要的呢,这也是数据类型的作用了。

3,指针的数据类型充当标明存放在其内存空间内的数据的数据类型,方便解析其所指向的数据。

普通类型的强制转换

例如,定义如下:

void main()
{
    /*假设它们是连续存储于某个地址空间,起始地址是100,则我们可以得到如下内存分布*/
    int a;         //占4Bybes    100-103
    float b;       //占8Bybes    104-112
    double c;      //占8Bybes    113-121
    long double d; //占10Bybes   122-132

    fload e = float(a);
}

当我们用a时,由于前面把a定义为int型,则编译器知道从a的地址(100)开始向后取4个字节再把它解释成int型。那么(float)a,就是先按照int类型取出该数值,再将该数值按照int to float的规则转换成float型。所以强制类型转换就是按照某个变量的类型取出该变量的值,再按照***to***的规则进行强制转转换。由于有先取出,再存入的过程,中间不会造成数据的丢失。如果是(类型名)常数,则是将该常数按照常数to类型 的规则进行强制转换。

指针的强制类型转换

指针同样也是一个变量,其自己占据一个4个字节的地址空间(由于程序的寻址空间是2^32次方,即4GB,所以用4个字节表示指针就已经能指向任何程序能够寻址到的空间了,所以指针的大小为4字节),他的值是另一个东西的地址,这个东西可以是普通变量,结构体,还可以是个函数等等。

但是,由于所有的指针所占的空间大小都是4字节(指针的大小是4字节),他们只是声明的类型不同,故而我们可以将指针强制转换成int型或者其他类型。同样,我们也可以将任何一个常数转换成int型再赋值给指针。他们的值都是地址指向某个东西,他们对于机器来说没有本质差别,他们之间可以进行强制类型转换。”指针 to 指针“的强制类型转换是指将指针所指的内容的类型由原先的类型转换为后面的类型。

指针类型强制类型转换所携带的风险

如将一个double类型的指针强转为一个int类型的指针,即便和其他数据类型一样,将指针类型变量原先存储的内容先提取再存入,那提取存入的内容不过也就是一个所指向空间的首地址而已,再根据之前描述的指针获取所指向空间的数据的过程,根据首地址在访问到对应“楼层”后,会发现int类型数据占4层”楼高“,double类型数据占8层”楼高“,原本堆满了八层楼的数据,现在强转后,只获取到了4层,剩下的那4层数据,不就相当于丢了吗?从而引发数据乱码,或造成更大的风险。

 

参考博客

感谢两篇博客的指导:

指针强制类型转换的理解——https://www.cnblogs.com/al-fajr/p/11615413.html

 C语言指针强制类型转换——https://blog.csdn.net/mhjcumt/article/details/7355127

Supongo que te gusta

Origin blog.csdn.net/qq_17846375/article/details/114299071
Recomendado
Clasificación