关于c语言的指针强制类型转换的问题,如图,定义了4个char型数组,其中两个数组是的绝
如图,定义了4个char型数组,其中两个数组是的绝对地址在内存中是单数,另两个是双数,那么如果将其中的一个单数地址的数组强制转换为整形指针的话,那么在进行赋值的时候就会报...
如图,定义了4个char型数组,其中两个数组是的绝对地址在内存中是单数,另两个是双数,那么如果将其中的一个单数地址的数组强制转换为整形指针的话,那么在进行赋值的时候就会报错。请问为什么会这样?同时,说明一下如果在一个char型数组里面想要取出其中两个字节作为一个整形数据来应用应该怎样避免出现这样的决定地址指向单数的问题?对地址在内存中是单数,另两个是双数,那么如果将其中的一个单数地址的数组强制转换为整形指针的话,那么在进行赋值的时候就会报错。请问为什么会这样?同时,说明一下如果在一个char型数组里面想要取出其中两个字节作为一个整形数据来应用应该怎样避免出现这样的决定地址指向单数的问题?对地址在内存中是单数,另两个是双数,那么如果将其中的一个单数地址的数组强制转换为整形指针的话,那么在进行赋值的时候就会报错。请问为什么会这样?同时,说明一下如果在一个char型数组里面想要取出其中两个字节作为一个整形数据来应用应该怎样避免出现这样的决定地址指向单数的问题?
展开
2016-10-22
展开全部
出现这样的问题是因为在这个16位系统中,要求所有的16位或者32微数据都是对齐的数据。
这个对齐指的是,数据从偶数地址开始存放。这样的话,这个存放在存储器中的数据可以更有效地存取;否则这个数据的存取将需要花更多的时间(更根本的原因要深入到微机原理课程了。而实际上16位数据一定占用了两个地址所对应的单元,比如一个16位数起始地址为0x200,那么他就占用了0x200和0x201这两个地址所对应的单元,16位系统中这样的(以偶地址开始存放的)两个单元的数据可以一次被处理器所读写)。为了存取数据花费不必要的更多的的时间的情况出现,系统就禁止这样存放16位或者32位数据。这样16为或者32位数据的地址就总是偶数。于是当把一个奇数作为一个16位数的起始地址就会有这样的错误。
至于要避免,可能是不能避免这种情况但可以避免出错。这样就需要在转换之前做一个检查,如果要转化的是个奇数地址,就不要直接转换了,而是要变通的处理了。怎么变通,我想要视数据具体要如何处理而定。
这个对齐指的是,数据从偶数地址开始存放。这样的话,这个存放在存储器中的数据可以更有效地存取;否则这个数据的存取将需要花更多的时间(更根本的原因要深入到微机原理课程了。而实际上16位数据一定占用了两个地址所对应的单元,比如一个16位数起始地址为0x200,那么他就占用了0x200和0x201这两个地址所对应的单元,16位系统中这样的(以偶地址开始存放的)两个单元的数据可以一次被处理器所读写)。为了存取数据花费不必要的更多的的时间的情况出现,系统就禁止这样存放16位或者32位数据。这样16为或者32位数据的地址就总是偶数。于是当把一个奇数作为一个16位数的起始地址就会有这样的错误。
至于要避免,可能是不能避免这种情况但可以避免出错。这样就需要在转换之前做一个检查,如果要转化的是个奇数地址,就不要直接转换了,而是要变通的处理了。怎么变通,我想要视数据具体要如何处理而定。
追问
那么这个意思就是编译器已经定义了对其方式,为什么在定义一个数组的时候不指定他的头地址是以双数的形式保存呢,而非要保存成单数的绝对物理地址,这样在进行强制类型转换的过程中一定会出错。
追答
是的,编译器已经定义了数据的对齐方式。
而这里的问题是,字符型数组,多个字符连续存放。字符在内存中只占用一个字节,连续存放意味着第一个字节(第一个字符)是偶地址的话,那么第二个字节就一定是奇数字节了,那么就出现了这个问题。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询