指针转换的时候,出了问题,愿意是想传一个8位的值,通过函数修改后再传回来。函数的参数是16位的。结果却是8位的值取了16位的高字节。编译器使用的Keil。于是写了一个例子(large mode, small mode同样):
#include <stdio.h>
typedef unsigned char INT8U;
typedef unsigned int INT16U;
INT8U fun(INT16U *p)
{
*p = 0×4321;
return *p;
}
void main()
{
INT8U a = 0;
INT8U b = 0;
b = fun((INT16U*)&a);
TI = 1;
printf(“a=0x%x \r\n”, (INT16U)a); // what’s this?
printf(“b=0x%x \r\n”, (INT16U)b); // and this?
}
结果是什么?
a = 0×43
b = 0×21
======================
原因是什么呢?
在调试的时候,从汇编语句和memory窗口来看,原来是16位指针和8位指针地址位置不一样引起来的。先看图:
1、进入函数时
2、准备返回
3、调用完函数后,a为0×43, b= 0×21.
b通过寄存器传递。
=========
另外一个例子:
INT8U fun(INT16U *p)
{
INT8U *p2;
INT8U c = 0;
p2 = (INT8U*)p;
*p = 0×4321;
c = *p2; // what’s c
return *p;
}
// c是多少? [0x21]
而如果放到VC6.0上编译运行,结果a = 0×21, b=0×21.
总结对于C51指针转换来说,如果是普通的转化,和PC, ARM同。如果是函数的指针参数,却要注意。就用正确的指针类型来调用。
Posted by Ian at 12:52 Tagged with: keil, pointer
#include <stdio.h>
typedef unsigned char INT8U;
typedef unsigned int INT16U;
INT8U fun(INT16U *p)
{
*p = 0×4321;
return *p;
}
void main()
{
INT8U a = 0;
INT8U b = 0;
b = fun((INT16U*)&a);
TI = 1;
printf(“a=0x%x \r\n”, (INT16U)a); // what’s this?
printf(“b=0x%x \r\n”, (INT16U)b); // and this?
}
结果是什么?
a = 0×43
b = 0×21
======================
原因是什么呢?
在调试的时候,从汇编语句和memory窗口来看,原来是16位指针和8位指针地址位置不一样引起来的。先看图:
1、进入函数时
2、准备返回
3、调用完函数后,a为0×43, b= 0×21.
b通过寄存器传递。
=========
另外一个例子:
INT8U fun(INT16U *p)
{
INT8U *p2;
INT8U c = 0;
p2 = (INT8U*)p;
*p = 0×4321;
c = *p2; // what’s c
return *p;
}
// c是多少? [0x21]
而如果放到VC6.0上编译运行,结果a = 0×21, b=0×21.
总结对于C51指针转换来说,如果是普通的转化,和PC, ARM同。如果是函数的指针参数,却要注意。就用正确的指针类型来调用。
Posted by Ian at 12:52 Tagged with: keil, pointer