当前位置: 代码迷 >> 单片机 >> 在keil中 char型指针读取int型变量的有关问题
  详细解决方案

在keil中 char型指针读取int型变量的有关问题

热度:170   发布时间:2016-04-28 14:45:11.0
在keil中 char型指针读取int型变量的问题
调试环境keil 2,
目的:想查看一下int型变量在内存中的存储方式,以便于将整个数组用指针的形式存入eeprom中。
结果与想象的有吻合的地方,也有无语的地方,无奈只好求助大神解惑。

下面是我在keil中写的三段代码,就是用 char型的指针p 读取int型变量a,赋值给变量b,预期是b先等于a的高8位,在等于a的低8位。注释是我调试时分步执行记录下的调试数据和疑问。未拷入单片机试验,仅仅在keil中调试。

//======目的:试验int型变量在内存中的存储方式====
//char b 为局部变量

int a=0x1234;

main()
{
char *p;
char b;
p=&a; //p=0x0b, *p=0x12


b=*p; //b=0x00,(为什么会是0,而不是0x12)
p++; //p=0x0c
b=*p; //b=0x34

while(1);
}


//======目的:试验int型变量在内存中的存储方式====
// char b 为全局变量

int a=0x1234;
char b;
main()
{
char *p;
p=&a; //p=0x08, *p=0x12


b=*p; //b=0x12(这里感觉正常了)
p++; //p=0x09
b=*p; //b=0x34

while(1);
}

//======目的:试验int型变量在内存中的存储方式====

int a=0x1234;

main()
{
char *p;
char b=0; //此时c=0x01
char c=0; //c=0x01 (为什么还是01)
p=&a; //p=0x0b, *p=0x12


b=*p; //b=0x00,
b=*p; //b=0x00;
c=*p; //c=0x12 (为何c被赋值了,而b没有)


p++; //p=0x0c
b=*p; //b=0x34

while(1);
}


------解决思路----------------------
关优化。
int a = 0x1234;
#pragma optimize(0)
main()
{
    char *p;
    char b;

    p = &a; //p=0x0b, *p=0x12
    b = *p; //b=0x00,(为什么会是0,而不是0x12)
    p++; //p=0x0c
    b = *p; //b=0x34

    while(1);
}
------解决思路----------------------
被优化掉了,keilc会尽可能高效的利用寄存器A

int ax=0x1234;

main()
{
char *p;
char bx=0; //此时c=0x01
char cx=5; //c=0x01 (为什么还是01)
char m,n;

p=(char*)&ax; //p=0x0b, *p=0x12
m=cx+5;//让cx有作用

bx=*p; //b=0x12,
m=m+6; 隔离开,不让其直接使用A
n=bx+5;
bx=*p; //b=0x00;


cx=*p; //c=0x12 (为何c被赋值了,而b没有)


p++; //p=0x0c
bx=*p; //b=0x34

while(1);
}
------解决思路----------------------
用仿真器调试看当前行赋值结果应该在下一行打断点。另外注意关优化也可以使用volatile关键字修饰变量。
  相关解决方案