我有一个代码,它使用数字配方的标准程序来寻找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中发生的事情或者如何解决这个问题吗?
非常感谢,
答案 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值是完全不同的范围,出错的地址就在那之后,所以如果检查调试器中的变量,可能第一次读[我打赌i
和k
为零。