我已经开发了两个版本来解决背包问题。 一个为N * C矩阵分配存储器,而另一个为(N + 1)*(C + 1)矩阵分配存储器。 最大内存带宽为8 GB。 我的两个程序都成功运行某些输入文件,并且不超过内存带宽。
对于其中一个超过8 GB内存带宽的输入文件,它会显示分段错误。但是在使用gdb调试程序时,它显示:对于两个版本:
从knapSeq1读取符号...(没有调试符号 实测值)...完成的。
但是当我尝试使用
运行程序时gdb运行knapSeq1
它显示以下错误:
版本1:
对象数量为235638231400,容量为1. [ERROR] :无法为权重/利润分配内存。 [劣势1(过程 19432)退出代码01]
随着输入文件中对象数量的增加,进程xxxx发生变化。
版本2:它显示如下: - (对于一个程序超出内存带宽的输入文件)并显示分段错误
对象数为-584969880,容量为1。 程序接收信号SIGSEGV,分段故障。 来自/lib64/libc.so.6的memset()中的0x00000036dd8894de
对于成功运行的其他文件,gdb的输出与上面相同。
我的问题是:
(1)如果版本1,程序运行成功(给出正确的输出),为什么gdb显示这样的错误?
对于版本2,即使程序成功运行(给出正确的输出)并且没有显示分段错误,为什么gdb显示这样的错误?
(2)我们如何纠正程序,以免它出现分段错误?
在这两个程序中,我正在分配内存:
table = (int*) malloc ((N+1)*(C+1)*sizeof(int*));
table= (int*)malloc((N)*(C)*sizeof(int*));