类型强转和字节对齐

  当一个较少字节对齐类型的指针强转为一个较多字节对齐的指针类型时,这样有些时候会产生问题。

  在arm的平台上,这个问题比较明显,在x86平台上运行后没这个问题

typdef struct

{

int addr;

int rdda;

}Test_t;

int main()

{

short int a;

short int s[2];

short int *pt = &s;

Test_t tt;

Test_t *pt = NULL;

tt.addr= 0x11223344;

memcpy(s,&tt,sizeof(Test_t)); //没有问题,数据能正确拷贝

for(a = 0; a < 2; a++)

printf("%x",s[a]);

printf("\r\n");

printf("s addr %p\r\n",&s);

pt = (Test_t *)buff; //这里可能会出问题

printf("pt->a %x b\n",pt->a,pt->b);

}

在arm平台下运行:

[email protected]:~# ./arm-test

33441122

s addr  0xbeb02ca2

pt->a 2cc83344 b 11220002

  可以看到memcpy拷贝的数据打印没有问题,但是s的地址是只能被2整除,在强转成4字节对齐的指针类型时候,出现了错误,可以看出是从s地址的前两个字节地方开始读取数据,

造成结构体中的a数据出错。

  在x86平台linux上运行:

[email protected]:~/project/arm$ ./a.out

33441122

s addr  0xbfede93a

pt->a 11223344,b 2

  在x86平台上 s的地址也是不能被4整除,但是强转正常

  这个可能和平台有关,在arm上做开发时,需要注意这个强转和字节对齐的问题。

类型强转和字节对齐,布布扣,bubuko.com

时间: 2025-01-03 20:59:39

类型强转和字节对齐的相关文章

stm32中字节对齐问题

ARM下的对齐处理   from DUI0067D_ADS1_2_CompLib 3.13 type  qulifiers 有部分摘自ARM编译器文档对齐部分  对齐的使用:  1.__align(num)     这个用于修改最高级别对象的字节边界.在汇编中使用LDRD或者STRD时     就要用到此命令__align(8)进行修饰限制,来保证数据对象是相应对齐.     这个修饰对象的命令最大是8个字节限制,可以让2字节的对象进行4字节     对齐,但是不能让4字节的对象2字节对齐.  

字节对齐

今天我们总结在C++和C语言中让我们头疼的字节对齐问题: 一.首先来看什么是字节对其? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任 何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 二: 那么问题就来了为什么要字节对其?以及字节对其的作用? 各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址开始存

C语言:内存字节对齐详解[转载]

一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 2. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址开始存取.其他平台可能没有这种情况, 但是最常见的是如果不按照适合其平台的要求对数据存放进行对齐

结构体字节对齐问题(转)

原文出处:http://wenku.baidu.com/view/019e26b765ce0508763213e2.html 初学C,对结构体的使用sizeof计算所占字节数不是很明白,看了此篇文章,终于豁然开朗,转载过来,方便以后温故. #include<stdio.h> struct a {   char no[10];   int p;   long int pp;   unsigned int ppp;   char x;   float y;   double h; }xy; voi

结构体字节对齐

结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何 变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列, 而不是简单地顺序排列,这就是内存对齐. 内存对齐的原因: 1)某些平台只能在特定的地址处访问特定类型的数据: 2)提高存取数据的速度.比如有的平台每次都是从偶地址处读取数据,对于一个int型的

C/C++中避免系统的字节对齐

在定义了一个新的Struct后. 系统会按照一定的规则将新生命的类型变量进行字节对齐,如下结构体: typedef struct Test{ int a; char b[6]; }Test; 该结构体类型可能会被对齐为12个字节. 那么,在内存流和文件流操作中可能会出现这样的用法: fwrite(strPtr,1,sizeof(Test)*len,fp); 事实上,被写入了len*12个字节,因为sizeof(Test)实际上不等于10,而是12. 那么,如下简单地操作可以避免在流操作中出现的一

字节对齐问题

文章最后本人做了一幅图,一看就明白了,这个问题网上讲的不少,但是都没有把问题说透. 32位机器上各种数据类型的长度如下:char:1(有符号无符号同) short:2(有符号无符号同) int:4(有符号无符号同) long:4(有符号无符号同) float:4 double:8 一.概念    对齐跟数据在内存中的位置有关.如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐.比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的.   二.为什么要

C语言字节对齐 __align(),__attribute((aligned (n))),#pragma pack(n)

转载地址 : http://blog.csdn.net/21aspnet/article/details/6729724 一.概念    对齐跟数据在内存中的位置有关.如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐.比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的.   二.为什么要字节对齐   需要字节对齐的根本原因在于CPU访问数据的效率问题.假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访

C/C++基础笔试题1.0(字节对齐)

传说中博文标题带有笔试.面试等点击率都会很高呢?我也试试! 众生皆是码农命,我们这种即将战秋招的渣渣,既没有超凡的能力,也没有流弊的项目,怎么破? 唯独苦苦怒刷基础,笔试题,面试题,因为以前常常刷OJ,所以很多面试题的编程题倒是可以解,但是笔试题或者基础题我就不记得了,唯独慢慢回想. 况且,写这种面试题,谁能写得赢JULY神. 今天首先讲得是字节对齐. 注意:我是一个渣,所以我只能按自己的理解来说了(要不然怎么会这么惨呢?).如果你想看大神的解释,请看这里 来看个题目 #include <ios