我有一个代码,该代码使用标准的数值配方例程来查找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机器中,该程序在执行方面没有任何困难,并为我提供了正确的答案。Google搜索没有帮助获得任何相关答案。有人可以暗示Mac中发生的事情还是如何解决此问题?
非常感谢
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,错误发生在0x000000000140400008,稍后8个字节。这很有可能是针对z
的缓冲区溢出(数范围的数组)。
为什么它在linux中起作用:这可能与分配策略有关,例如,如果Alloc库将内存分配为16个字节以提高性能,并且您要求块8个字节,那么16个字节将是分配。没有保护者或金丝雀,没有什么可以阻止您解决一个超越界限的项目,并且分配了一个额外的物品,您将不会得到一个segfault。
但是在分配8个字节块的机器上,相同的代码将崩溃。
我强烈认可Andreas Florath的建议:对您在Linux中的计划进行valgrind,并检查越野外的访问权限。或者,您可能想验证z
的大小以及实际访问它的位置。
我可以肯定的是,您的z
未正确定义(或某些调用Conventon设置或类似的呼叫是错误的)。
很可能是在Linux上"工作",但在MAC上却没有 - 也许是因为内存区域的排列方式不同,但是我几乎可以肯定的是,问题与您传递给TQLI()的问题 - 如果您看D&e值,它们看起来像是Saen地址(用于堆栈变量)。z值是完全不同的范围,而错误的地址就在此之后,因此可能第一个读取[如果您在调试器中检查变量,我敢打赌i
和k
为零。