2014-11-25 66 views
3

任何人都可以请帮我理解以下几点。我正在重新分配一个指针,并使用一个临时值来获取它指向的内容。我没有理由认为案例1应该起作用,案例2不应该起作用。重新分配一个指针?

//案例1:本作品:

void main (void){ 

    unsigned int nr1; 
    unsigned int nr2; 
    unsigned int * ptr_int; 
    unsigned int temp1_value; 
    unsigned int temp2_value; 

    while(1){ 

     nr1 = 0x1234; 
     ptr_int= &nr1; 
     temp1_value = *(ptr_int); // Copy nr1 to temp1_value 

     nr2 = 0x5678; 
     ptr_int= &nr2; 
     temp2_value = *(ptr_int); // Copy nr2 to temp2_value 

    } 
} 

//案例2:这不起作用(如果我走一步看一步,temp1_value不改变)

void main (void){ 

    unsigned int nr1; 
    unsigned int nr2; 
    unsigned int * ptr_int; 
    unsigned int temp1_value; 
    unsigned int temp2_value; 

    while(1){ 

     nr1 = 0x1234; 
     ptr_int= &nr1; 
     temp1_value = *(ptr_int); //Copy nr1 to temp1_value 

     nr2 = 0x5678; 
     ptr_int= &nr2; 
     temp1_value = *(ptr_int); //Copy nr2 to temp1_value 

    } 
} 

我我确信这是一个基本的东西,但我不能指责它。

我不允许重新指定指针吗?

谢谢。

编辑:它嵌入C.目标是一个8051微控制器。

+1

temp1_value始终与nr2相同。 (0x5678) – CalinTamaian 2014-11-25 14:53:05

+0

您是否意味着要将最后一个赋值赋给temp2_value而不是temp1_value,就像现在这样? – Kaganar 2014-11-25 14:53:06

+4

也许你的编译器已经对最初的几行进行了优化,因为它们还没有用于任何东西。尝试在每次分配后将一些printf打印出temp1_value的值,这将迫使它不进行优化。 – 2014-11-25 14:53:57

回答

2

谢谢你杰里米和伦丁。

在对类似情况下别人绊倒,改变

unsigned int temp1_value; 

volatile unsigned int temp1_value; 

给了我预期的行为。

+0

这就是为什么你应该避免在你的调试版本中启用优化。 – Lundin 2014-11-25 15:34:20