2010-08-10 111 views
2

有誰知道可能會導致array [n]和array [x](x = n)的讀回值彼此不同嗎?爲什麼array [n]和array [x]其中x = n返回不同的值?

編輯:以下是一個可編譯的代碼來說明我遇到的問題。如果您運行以下代碼,則不會看到任何問題。我只是用它來描述我在我的原始程序中看到的問題,該程序是一個擁有100多個課程的模擬器。

#include <iostream> 

using namespace std; 

class MySimulatorImplementationBy100Classes; 

class MySimulator { 
public: 
    enum SigList { 
     SIG0, 
     SIG1, 
     SIG2, 
     // ... 
     SIG18=18, 
     SIG19=19, 
     SIG70=70, 
     SIG80=80 
    }; 

    void run() {} 
private: 
    MySimulatorImplementationBy100Classes *impl_; 
}; 

int main() { 
    MySimulator sim; 
    // set up the simulation 

    sim.run(); 

    enum SigAnalysis { 
     ANALYSIS0, 
     ANALYSIS1, 
     ANALYSIS2, 
     ANALYSIS3, 
     ANALYSIS4, 
     ANALYSIS5, 
     ANALYSIS6, 
     NUM_ANALYSIS 
    }; 

    const MySimulator::SigList signal_source[NUM_ANALYSIS] = { 
     MySimulator::SIG18, 
     MySimulator::SIG18, 
     MySimulator::SIG18, 
     MySimulator::SIG18, 
     MySimulator::SIG70, 
     MySimulator::SIG80, 
     MySimulator::SIG19 
    }; 

    for(int i=0; i<NUM_ANALYSIS; ++i) { 
     cout <<signal_source[i]<<"\t" << MySimulator::SIG80 <<"\t" << signal_source[5] << "\t" << i << "\t"; 
     cout << &signal_source[i]<<"\t" << &signal_source[5]<< "\n"; 
    } 

} 

在我的計劃中,輸出

18    80  80  0  0xfffe1c90  0xfffe1ca4 
18    80  80  1  0xfffe1c94  0xfffe1ca4 
18    80  80  2  0xfffe1c98  0xfffe1ca4 
18    80  80  3  0xfffe1c9c  0xfffe1ca4 
70    80  80  4  0xfffe1ca0  0xfffe1ca4 
173068832    80  80  5  0xfffe1ca4  0xfffe1ca4 
168047112    80  80  6  0xfffe1ca8  0xfffe1ca4 

雖然我希望它是

18    80  80  0  0xfffe1c90  0xfffe1ca4 
18    80  80  1  0xfffe1c94  0xfffe1ca4 
18    80  80  2  0xfffe1c98  0xfffe1ca4 
18    80  80  3  0xfffe1c9c  0xfffe1ca4 
70    80  80  4  0xfffe1ca0  0xfffe1ca4 
80    80  80  5  0xfffe1ca4  0xfffe1ca4 
19    80  80  6  0xfffe1ca8  0xfffe1ca4 

我不知道爲什麼signal_source[i]當i = 5點返回的東西從signal_source[5]不同,而&signal_source[i]&signal_source[5]是相同的。

而且,如果我的for循環cout

sim.run(); 

    // dummy print 
    cout << "dummy\n"; 

    enum SigAnalysis { //...  

在什麼地方增加一些假的碼結果將改變:

dummy 
172402312    80  80  0  0xfffe1c90  0xfffe1ca4 
172446752    80  80  1  0xfffe1c94  0xfffe1ca4 
18    80  80  2  0xfffe1c98  0xfffe1ca4 
18    80  80  3  0xfffe1c9c  0xfffe1ca4 
70    80  80  4  0xfffe1ca0  0xfffe1ca4 
80    80  80  5  0xfffe1ca4  0xfffe1ca4 
19    80  80  6  0xfffe1ca8  0xfffe1ca4 

有沒有人有什麼線索可以去錯在這裏?

我使用的是gcc版本3.4.6。謝謝您的幫助!

+0

你能整理一個可編輯的例子嗎?這是剝離的代碼? (並且在附註中,您可能想要使用更新版本的gcc) – GManNickG 2010-08-10 20:23:06

+0

上面的代碼在VS2010中對我進行了罰款,除非我必須填寫由......指示的缺少的枚舉。因此,請按照GMan建議弄清楚你的代碼正在發生什麼。 – naivnomore 2010-08-10 20:29:07

+0

您可能還想打印出您的結果,以確認您的索引沒有做任何奇怪的事情。不知道這是否會有所幫助,但值得一試。 – Shaded 2010-08-10 20:52:39

回答

2

我能想到的唯一事情就是破壞signal_source(或者可能是i)。

發佈一個更完整的代碼示例。

更新:這是我的測試程序。它完全按照預期工作。

enum SigList { 
    SIG0, 
    SIG1, 
    SIG2, 
    SIG18 = 18, 
    SIG70 = 70, 
    SIG80 = 80, 
    SIG100 = 100 
}; 
const SigList signal_source[7] = { 
    SIG1, 
    SIG1, 
    SIG1, 
    SIG1, 
    SIG18, 
    SIG70, 
    SIG80 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    cout << signal_source[0] << "\n"; // return 1 (SIG1) 
    cout << signal_source[1] << "\n"; // return 1 (SIG1) 

    for(int i=0; i<7; ++i) 
    { 
     cout << signal_source[i] << "\n"; 
    } 

    return 0; 
} 
0

我的第一個建議是valgrind下運行的程序。我發現這些類型的隨機腐敗問題可能由未初始化的值傳遞給系統調用引起。

以下是另一個想法:嘗試將隨機打印語句放在整個地方,看看問題是否發生了變化,然後確定是內存損壞的跡象。

0

也許當你到達循環,signal_source是空的,因爲你還沒有初始化它,或者因爲你在另一個函數?

相關問題