2010-08-10 217 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是空的,因为你还没有初始化它,或者因为你在另一个函数?

相关问题