增加数组大小时出现分段错误
我正在编写一个C程序。在第一行,我有增加数组大小时出现分段错误
typedef float m_elem[NMAX][NMAX][3];
m_elem asa_m;
m_elem asa_mi[100];
然后,一些计算。目前,对于每次运行并取决于输入,我将代码更改为NMAX值,然后重新编译并运行它。对于低于500的NMAX值,程序运行正常,但对于更高的NMAX值(我需要某些输入文件),我得到的是分段错误。
你有什么建议我在这里做什么?我读到的valgrind学习,但在这种情况下,我不知道如果只是改变编译选项某种程度上允许处理更大的矩阵的方案将帮助
感谢
你可能运行的堆栈空间。
在NMAX = 500时,asa_mi
变量将需要500 * 500 * 3 * 100 * 4个字节或约300 MB。大多数操作系统不会允许一个很大的堆栈,所以你可能想检查你的系统的限制。
你尝试从堆中分配的,与malloc()
呢?
静态分配是另一种选择。 – 2010-09-01 11:56:01
我的猜测是,你用完堆栈内存。 我建议用大量的数据
像其他的处理都表示这可能是一个堆栈问题时动态分配内存。如果array是某个函数的局部变量,那么情况可能如此。这会失败,因为CPU从堆栈指针中索引的能力有限,或者堆栈分配的失败方式与无限递归引发的堆栈溢出相似。后者会导致分段错误,因为系统在你已经定义的堆栈空间上有一个上限,或者因为某些原因它会自动拒绝为它分配。这可能在不同的操作系统上有所不同如果CPU的堆栈索引不仅仅是有限而是中断,则前者只会导致分段错误,导致STACKPOINTER偏移量产生错误的地址;我不知道有任何CPU有这个问题,但它是可能的。考虑使用静态,全局或动态(malloc)数组,这应该避免这个问题。
这也可能与使用不一致NMAX常数的问题。你可能已经让NMAX的一些硬编码值出现在那里,而当你使用其他(更大的)值时,你最终会超出这个值。
同样的,你可能只是有一个数组索引溢出,只有引起分段错误,如果当n最大/大。由于NMAX被用作m_elem阵列的二维尺寸,它的增长相对于NMAX是指数型的。对于较小的NMAX值,它可以全部驻留在一个内存页面中,并且由于OS通常通过页面跟上程序的内存,溢出可能不会导致分段错误。随着NMAX变得更大,它可能需要更多的内存页面来容纳它。随着数组的增长(按指数规律),索引超出边界错误的机会将扩展到内存页面中,该页面不包含数组的任何部分,并且可能根本不是程序的一部分(或者至少不是可写部分)。如果将3D阵列想象成高度为3,长度为NMAX,宽度为NMAX的城堡墙,并且该城堡的一面墙很弱并且容易被破坏,那么每次增加NMAX时,您都会将所有墙更长,包括那个有缺陷的墙,所以你的城堡里有更多错误的墙。
感谢您的详细和有见地的答案 – flow 2010-09-02 11:19:32
可能的重复http://stackoverflow.com/questions/571945/getting-a-stack-overflow-exception-when-declaring-a-large-array – 2010-09-01 13:07:38