2014-11-21 37 views
1

有關指針行爲的快速問題(我正在PIC32MX270F256D上進行項目工作)。PIC32器件上的指針與調試器中的期望值不匹配

我目前執行以下代碼:

void main(void) 
{ 
    int size = 15; 
    int check; 
    int *ptr; 

    ptr = &size; 
    check = *ptr; 

    while(1);  //just so it hangs at the end 
} 

現在我步進通過程序可變手錶上。在聲明尺寸後,我可以在監視窗口看到尺寸值爲15,地址爲0xA000FFC8(迄今爲止非常好)。在行ptr = &size;之後,觀察窗口顯示ptr的值爲0xA000FFC8(如預期的那樣)。現在在最後一行(check = *ptr;)之後,監視窗口顯示檢查值爲0xA000FFC8。

這對我來說似乎非常簡單的功能。最後,在while循環中掛起時,檢查值應該是15,否?如果是,我的代碼是否錯誤,或者Microchip IDE顯然有問題?如果沒有,我錯過了什麼讓它像這樣工作?

謝謝。

-Sean

注:我使用的MPLAB X和Microchip的XC32編譯器。

+2

如果您的編譯器確定您的代碼實際上沒有做任何事情,那麼它會不會生成一些代碼(即優化它)?如果將'int * ptr;'更改爲'volatile int * ptr;'''check'會得到15嗎?你可以關閉編譯器優化嗎? – indiv 2014-11-21 19:11:24

+1

^+ 1。看起來像優化問題。 – 2014-11-21 19:13:50

+0

這一行:check = * ptr;導致未定義的行爲,因爲解引用指向地址15的點(其中地址15不是分配的內存地址)意味着讀取內存內容可能/可能進入只讀內存頁面。這'可能'導致seg故障事件。 – user3629249 2014-11-21 19:46:28

回答

1

這可能是一個優化問題。您的編譯器確定您的代碼實際上沒有做任何事情,所以它不會生成代碼。具體而言,您的代碼實際上並未使用您在check中存儲的值。

你可以聲明你的指針爲volatile,強制編譯器不要優化它。即,int *ptr;變成volatile int *ptr;

您也可以以有意義的方式使用check的值,如打印出來。

printf("My pointer %p points to %u.\n", ptr, check); 

或者您可以查看您的編譯器文檔並找出如何關閉優化。在進行調試時,無需進行優化即可進行編譯,這樣編譯後的代碼就能與您的源代碼緊密匹配。

注意:您將在某些時候想要訪問已映射到內存地址的硬件或芯片寄存器。當你這樣做時,確保映射內存的這些指針是不穩定的,否則你將會遇到同樣的問題!

+0

爲了澄清,聲明「volatile int * ptr;」解決了我的問題。我從未困擾過試圖優化關閉。 – detroitwilly 2014-11-22 01:51:34