C程序 - 不同机器上的不同行为。内存分配问题?

时间:2011-09-15 11:58:57

标签: c macos gcc ubuntu memory-management

我有一个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机器上工作。

我希望问题很清楚,任何帮助都表示赞赏。 谢谢!

2 个答案:

答案 0 :(得分:2)

嗯,很明显,其中一个X []或A []数组被索引超出范围。就像测试用unsigned或size_t替换所有数组索引一样,重新编译并在调试器下运行。该程序可能会出现段错误。

答案 1 :(得分:2)

首先 - 你的程序中肯定有一个错误,提高编译器警告的级别,或者运行valgrind可能有助于找到它。

内存布局自然不同,因为不同的编译器和CPU架构,我的第一个猜测是该问题与64位与32位架构相关(影响指针大小,内存对齐等)。