关于内存地址对齐的问题(2007年工作的心得)

我们都知道在32位的cpu的系统上,我们的指针的长度为 4 byte。在一些32位的cpu系统上,如果:

unsigned char * pData;

pData = (unsigned char * ) malloc( Length *sizeof(unsigned char ));

if (pData == NULL)

{

    printf("malloc fialed /n");

   return 0;

memset(pData,0,Length *sizeof(unsigned char ));

……

int  test = 1234;

(unsigned long *) (pData + 50) = test ;//some cpu think it error

//if you write it to :memcpy(pData+50,&test,sizeof(test));any cpu think ok.

……

 

 

看到这里我们应该明白:如果我们在对某个地址指针在进行赋值时,我们要保证我们的左值地址为4 的整数倍(这是对于32位cpu而言的,如果为64位则应为8的整数倍),当燃了,如果pData + 40 ,但是pData 却不为4的整数倍那也不对,我们是要保证他们的和为4的整数倍。如果我们用memcpy 的话,就不存在这样的问题了,因为我们是一byte一byte拷贝赋值的。

其实,我们现在的很多cpu 已经不在意我的第一种写法了,可是前日子就遇到了这样的问题,但是百思不得其解,还认为我的那块开发板子有什么问题,后来才知道是自己经验不足,太无知了。如果你也遇到这样的问题时,千万不要怀疑你的环境,那是我们无知造成的后果。

哈哈^0^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值