在mac中分段错误11,但在linux,gcc编译器中没有

时间:2012-12-23 10:45:25

标签: linux macos gcc segmentation-fault numerical

我有一个代码,它使用数字配方的标准程序来寻找3x3矩阵的特征向量。虽然代码在linux机器上运行完美,但它在mac上出现了分段错误11。使用gdb,当我回溯跟踪时,我发现

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000140400008
0x0000000100002a88 in tqli (d=0x7fff5fbffaa4, e=0x7fff5fbffa98, n=3, z=0x140400000) at     ac_nr.c:402
402                         f=z[k][i+1];

其中tqli是数字收件人中的标准例程,并且z被正确定义。我可以自信地说,因为在linux机器上程序没有遇到执行上的困难,并且得到了正确的答案。谷歌搜索无助于获得任何相关答案。任何人都可以暗示mac中发生的事情或者如何解决这个问题吗?

非常感谢,

2 个答案:

答案 0 :(得分:3)

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000140400008
0x0000000100002a88 in tqli (d=0x7fff5fbffaa4, e=0x7fff5fbffa98, n=3, z=0x140400000)
at     ac_nr.c:402
402                         f=z[k][i+1];

如您所见,您的z指针为0x140400000,错误发生在0x0000000140400008,后者为8个字节。这很可能是缓冲区溢出z(数组越界)。

为什么它在Linux中有用:可能与分配策略有关,例如,如果alloc库以16字节的块分配内存以提高性能,并且您请求一个8字节的块,则16字节将是分配。没有保护者或金丝雀,没有任何东西可以阻止你解决超出界限的一个项目,并且已经分配了多达一个额外项目,你将不会得到一个段错误。

但是在分配8个字节块的机器上,相同的代码将崩溃。

我强烈支持Andreas Florath的建议:在Linux中对你的程序运行valgrind并检查越界访问。或者,您可能需要验证z的大小以及实际访问它的位置。

答案 1 :(得分:0)

我很确定你的z没有被正确定义(或者某些调用conventon设置或类似错误)。

很可能代码“在Linux上运行”而不是在Mac上运行 - 也许是因为内存区域的排列方式不同,但我几乎可以肯定问题是你传递给tqli()的问题 - 如果你看看d& e值,它们看起来像saen地址(对于堆栈变量)。 z值是完全不同的范围,出错的地址就在那之后,所以如果检查调试器中的变量,可能第一次读[我打赌ik为零。