我有一个C程序在两台机器上运行时给出不同的结果。
在第一台机器上(Linux Ubuntu,gcc编译器v 4.4.3,64位,4GB内存),它似乎工作正常,并给出了合理的结果(实际上这是主要开发它的机器)。
在第二台机器(Mac OSX 10.5.8,gcc编译器v 4.4.5,32位,2GB内存)上,结果似乎是无稽之谈。
特别地,在FOR循环期间填充有阵列A,其中每个项A [i]取决于A [i-1]。我发现在大约4000步后我的机器开始忘记A [i-1]值,然后计算废话。
对我来说更奇怪的是,如果在函数的变量声明的初始列表中我添加了另一个虚构数组,问题就消失了,我甚至没有在程序中使用它。
即一个带有标题的代码,如
...
double X[n_max];
double Y[n_max];
double A[n_max];
...
有效,而
...
double X[n_max];
// double Y[n_max];
double A[n_max];
没有。
我想在内存分配方面存在某种问题,而且当我为虚拟数组Y分配内存时,这个混乱只会移动到其他地方。
我不明白为什么我的Mac似乎没有覆盖它应该记住的数据的问题,也不明白为什么同一个程序在Linux机器上工作。
我希望问题很清楚,任何帮助都表示赞赏。 谢谢!
答案 0 :(得分:2)
嗯,很明显,其中一个X []或A []数组被索引超出范围。就像测试用unsigned或size_t替换所有数组索引一样,重新编译并在调试器下运行。该程序可能会出现段错误。
答案 1 :(得分:2)
首先 - 你的程序中肯定有一个错误,提高编译器警告的级别,或者运行valgrind可能有助于找到它。
内存布局自然不同,因为不同的编译器和CPU架构,我的第一个猜测是该问题与64位与32位架构相关(影响指针大小,内存对齐等)。