MIPS memcpy问题(我认为)

MIPS memcpy问题(我认为),c,mips,memcpy,memory-alignment,C,Mips,Memcpy,Memory Alignment,我有一些软件,我有一个红帽系统与国际商会的工作,它是工作良好。当我将代码移植到一个运行MIPS的IRIX系统时,我得到了一些计算结果,结果显示为“nan”,而这里肯定有值 我在非redhat系统上没有任何好的调试器,但我发现我的一些阵列中偶尔会出现“nan”,这导致我的点积计算返回为“nan” 鉴于我无法用调试器跟踪它,我认为问题可能出在memcpy上。具有动态分配数组的MIPS编译器memcpy()函数是否存在任何问题?我基本上是用 memcpy(to, from, n*sizeof(dou

我有一些软件,我有一个红帽系统与国际商会的工作,它是工作良好。当我将代码移植到一个运行MIPS的IRIX系统时,我得到了一些计算结果,结果显示为“nan”,而这里肯定有值

我在非redhat系统上没有任何好的调试器,但我发现我的一些阵列中偶尔会出现“nan”,这导致我的点积计算返回为“nan”

鉴于我无法用调试器跟踪它,我认为问题可能出在memcpy上。具有动态分配数组的MIPS编译器memcpy()函数是否存在任何问题?我基本上是用

 memcpy(to, from, n*sizeof(double));

我不能证明这一点,但我认为这可能是问题所在。有解决办法吗?也许中小企业数据不一致?我如何解决这个问题?

肯定支持
sizeof()
吗?

如果您的问题来自
memcpy
中的错误,我会感到惊讶。这可能是一个对齐问题:您的
double
s是否充分对齐?(如果您仅将它们存储在
double
double[]
对象中,或通过
double*
指针存储,则它们将是,但如果您通过
void*
指针移动它们,则可能不是)。X86平台比大多数平台更能容忍失调

您是否尝试在高警告级别使用gcc编译代码?(除了微控制器或大型机之外,Gcc几乎在任何地方都可用。它可能产生较慢的代码,但比“本机”编译器的诊断效果更好。)

当然,在代码的某些不相关部分中,可能总是存在缓冲区溢出或其他内存管理问题,而这些代码恰好没有在原始平台上造成任何可见的bug


如果您无法访问一个好的调试器,请尝试至少在关键位置打印内容。

内存区域
重叠是否可能
memcpy
不需要处理重叠的内存区域。如果这是您的问题,那么解决方法很简单,只需使用即可。

是。在这个系统上返回8,我将检查gcc是否在那里。我对此表示怀疑,因为这是一个相当专门构建的系统。我没有意识到它可能比另一个有更多的警告。它们的数组被定义为double*如果我在原始平台上使用类似于totalview的东西并打开内存调试,它仍然会给我一个答案w.r.t.缓冲区溢出之类的,对吗?也许我会尝试一下,即使它给出了正确的答案there@Derek:是的,尝试totalview或valgrind(免费且享有良好声誉)是个好主意,甚至在原始平台上也可能发现bug。虽然不能保证找到bug(如果有),但通常值得花时间尝试。我敢打赌,目标没有正确对齐,因此当memcpy工作时,访问数据后不需要未对齐的数据。结果是,在使用totalview运行此功能后,我仍然找不到内存越界情况或其他任何情况。运气不好,我在几个地方放了一份打印声明,这就是问题所在——空间溢出了1。它在英特尔系统上运行一定很幸运。