平时在数据的存储和通讯时,为了图方便,经常用指针转换的方式往缓冲区写数据,最近发现在MSP430下这种方式很危险。
例如:
测试环境:IAR FOR MSP430 ,单片机:MSP430F4152
char buff[64];//定义一个缓存
unsigned long a=12345678;//定义一个长整型数,并赋值为12345678
那么这时候,如果要将a的值赋值到缓存buff中的第一个位置,可以用以下指针操作的语句来完成:
*(unsigned long *)&buff[0]=a;
该语句运行后实际buff内的数据:
buff[0]=0x78
buff[1]=0x56
buff[2]=0x34
buff[3]=0x12
看起来很完美,语句简洁执行效率也很高。
但是,只要buff的起始地址是奇数,如0x0351,那么这条赋值语句实际上等于是往地址0x0350上写的,编译和运行都不会报错,但实际实行出来的结果是
buff[0]=0x56
buff[1]=0x34
buff[2]=0x12
buff[3]=0x00
而0x78这个数据被放置在0x0350上了,这个过程中无论是编译和执行都很正常没有报错,而结果却大不相同。
而实际写程序很少有人会在指针赋值前去判断地址是否为偶数位,IAR也不会提示该指针地址为奇数导致出错,这样岂不是多字节数据类型的指针转换赋值就不能使用了?一不小心就会踩到地雷。