This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

多字节数据类型的指针指向奇数地址时发生的错误

Other Parts Discussed in Thread: MSP430F4152

平时在数据的存储和通讯时,为了图方便,经常用指针转换的方式往缓冲区写数据,最近发现在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也不会提示该指针地址为奇数导致出错,这样岂不是多字节数据类型的指针转换赋值就不能使用了?一不小心就会踩到地雷。