2011-02-14 70 views
2

我在調用下面的函數,它計算傳入變量中給出的值。但是,當函數(calculate_distance)運行時,傳遞到函數中的變量(loc_ptr)中包含的數據似乎會改變。指針受函數調用影響不應該在哪裏

我已經遍歷代碼,發現變量loc_ptr在函數調用中受到影響,而不是在函數本身內。

函數在while循環中被調用。 while循環的第一次迭代計算正確,僅在後續迭代中才會出現問題。

_注:位置是一個typedef'ed結構,其中包含char * name,double latitude,double longitude。 options是doubles._

double calculate_distance(location from, location to) { 
    return to.latitude - from.latitude; 
} 

main() { 
    location current_location = {"Plymouth", 50.378565, -4.134339}; 
    location locations[3] = {{"Padstow", 50.5384, -4.9378}, 
          {"Newquay", 50.412, -5.0757}, 
          {"Boscastle", 50.684, -4.6929}}; 

    // create a pointer to an array of locations. 
    location* loc_ptr; 
    loc_ptr = &locations[0]; 

    double options[3]; 
    int i = 0; 
    int position = 3; 

    while (i < position) { 
     // calculate the distance between the current and other locations 
     options[position] = calculate_distance(current_location, 
               loc_ptr[position]); 
     position--; 
    } 
    // handle the rest of the algorithm 
} 

注意的陣列:該代碼是一個更大的算法的一部分,它的剪短因爲這將是相當長的。 while循環完成後,重構loc_ptr數組以刪除其中一個元素。

+1

什麼是位置?它是如何定義/分配的? – jswolf19 2011-02-14 08:46:26

+0

選項[]在何處以及如何定義? – pmod 2011-02-14 08:46:44

回答

0

您不能訪問位置[3],因爲該數組中最高的指數是2,你可能想:

for (int i = 2;i >= 0;i--) 
    options[i] = calculate_distance(current_location, locations[i]); 
} 
2

你的示例代碼執行...

  • 不編譯出於各種原因,拼寫錯誤和遺漏;和

  • 不包含任何可以解釋您觀察到的行爲的明顯錯誤。

這也是荒謬的(例如,locations不存在)。這意味着要麼你看到鬼,要麼你的示例代碼沒有顯示真正的代碼真正的功能(並且不再包含有問題的bug,因爲你把它切掉了)。

無論哪種方式,沒有人能真正知道,因爲你沒有提供足夠的信息。

嘗試this little debugging technique

編輯:更新你的問題後,至少你的示例代碼編譯正確(在我添加typedef後)。它在第一個循環上訪問未定義的存儲器(因爲定義爲例如options[3]的數組確實具有元素options[0] .. options[2],但不是options[3])。 不是發生什麼是loc_ptr的值以任何方式改變(如我使用調試器驗證)。所以,要麼你仍然看到鬼,要麼你的示例代碼不會顯示你遇到的問題(使它成爲毫無價值的例子)。我的建議(見上面的鏈接)仍然存在。

0

問題似乎是

loc_ptr = &locations[0]; 

locations似乎是location元件的陣列。獲取這個數組的第一個元素的地址會給你一個指向這個元素的指針。

爲什麼不只是做locations[position]而不是創建額外的loc_ptr來保存相同的信息?我很確定問題出在locations的內容 - 這也不在你的代碼片段的範圍內。

2

堆棧損壞?檢查選項[]位置[]數組的大小。使用斷言來避免跑出界限也是很好的。

所以,現在我看到索引的問題。 locations []數組有三個元素,但您可以在第一個循環(loc_ptr [position] - > loc_ptr [3])中訪問第四個元素,與選項[]相同。

1

形成代碼,似乎是第一次調用不存在的元素位置[3]。這很重要嗎?

相關問題