毕业论文
您现在的位置: 语言识别 >> 语言识别资源 >> 正文 >> 正文

数据的地址全乱了关于数据对齐

来源:语言识别 时间:2024/10/12
北京哪里能治白癜风 https://jbk.39.net/yiyuanzaixian/bjzkbdfyy/
今天和大家聊一下C语言开发C过程中发现的不可能事件——数据地址全乱了!!!这种情况在使用结构体的时候经常出现,一个是结构体的长度忽长忽短,另一个就是按结构体首地址去访问数据时,不是读错就是写错。有些莫名其妙,无论怎么看自己的代码都是正确的,这完全是不可能事件啊。是的,这就涉及到了C(不仅是它,其它的芯片也有这样的问题)的数据对齐的问题。C中的数据是按16位进行的,也就是说就算你使用char来定义一个数据,它的size肯定和int是一样长,我们来看段代码:这个打印出来应该是多少呢?char是8位的,int是16位的,而sizeof是按16位来算,那么i打印出来就应该是2喽?我们执行一下看看哦,size是3!也就说明两个char数据其实是占了两个16位。那么就发现了,原来在C中的数据存储最小单位是16位。如果是32位,当然是两个16位了。我们来看个带32位的结构体,看看它的长度是多少:这个长度是多少?char:别忽悠了,刚说了是16位,所以是1,long:2个,再来个char:1个,最后一个int:1个。所以总数是:1+2+1+1=5?我们执行一下6。。。怎么会这样?这就是庆叔今天要介绍的数据对齐的问题。在讨论这个问题的时候,我们先要了解一下C的数据存储规则:1.存储的最低单位是16位。2.而32位的数据,低地址存储数据的低16位,高地址存储数据的高16位。3.32位数据的低地址(第一个16位的地址)要能被2整除,否则往后移一个地址。第1个条件,我们验证过了。现在来看第2个是不是这样这里我把test.d赋了0x的数,可以看到test.d的址是0x12A,里面存了0x,而0x12A是先存的0x,然后0x12B才存0x,这是我们在进行按地址16位来读写数据的时候要注意的地方。然后0x12A是可以被整除的。因为长度是6,而我们算出来的长度是5,这说明是在long和第一个char中间有一个16位的空白,如果第一个char的地址是0x,就可以说明为了存32位数据,把奇数的0x给空了出来。我们看看chara的地址的确是0x,这就是数据对齐,C为了快速处理数据,如果是16位的就不存在对齐问题,如果是32位甚至是64位,那么数据的第一个地址就要对齐到偶数地址。我们再做个练习,看看下面的数据长度应该是多少:我们先把地址和数据排一下:地址数据长度0char11空白12long24char15int16float28char19空白long2所以长度为:12,运行验证一下答案是对的。从上面就可以知道,我们在进行结构体声明的时候,应该先处理16位的数据,将它们放在连续的空间中声明,再去声明32位和64位的数据,这样,数据空间最多只浪费一个16位,如果32位声明时中间加夹一些16位的数据,最后会发现很难找到一个数据正确的地址,而且数据结构的长度远超出预想的长度而浪费很多数据空间。好了,今天庆叔就介绍到这,希望小伙伴们有收获。

转载请注明:http://www.0431gb208.com/sjslczl/7763.html