我有一个直到最近才开始工作的程序。违规代码如下所示:
void writeTimeInfo(fitsfile *fptr, QList<QList<double> > &in)
{
double data[in.size() * in[0].size()];
long naxes[2];
int status = 0;
naxes[1] = in.size();
naxes[0] = in[0].size();
for (int i=0; i<naxes[1]; i++)
{
for (int j=0; j<naxes[0]; j++)
{
data[j+i*naxes[0]] = in[i][j];
}
}
fits_insert_img(fptr, DOUBLE_IMG, 2, naxes, &status);
fits_write_key(fptr, TSTRING, "EXTNAME", (void*)"HJD", "Extension name", &status);
fits_write_2d_dbl(fptr, 0, naxes[0], naxes[0], naxes[1], data, &status);
if (status)
fits_report_error(stderr, status);
}
该程序的细节并不重要(所有适合的东西,它用于操纵天文标准拟合文件),但目前程序段错误就行了
naxis[1] = in.size();
我看不出有什么问题 - 在此步骤之前我可以使用gdb查看in.size()和[0] .size()*两个数组维度)并检查数组值。这只是段落错误。
in
是一个2d QList数组,您可以通过函数参数列表看到。数组通过引用传递,以便不重复内存。我所做的唯一改变是在更大的输入集上运行程序,其中before(工作阶段):in是一个515 * 1508元素的2d双数组,而现在它是一个515 * 2480元素的数组。可能是堆栈上没有足够的内存吗?
干杯
答案 0 :(得分:1)
515 * 1508 doubles
的数组大约是6MB - 堆栈很多。这可能是一个stackoverflow。尝试使用--stack
的{{1}}选项设置堆栈限制为~10 MB(如果可能),并使用值515 * 2480进行测试。
在Windows上,使用VS2010 Beta,以下内容会崩溃堆栈:
ld
在堆上创建数组。如果您可以使用Boost,请使用int main() { double x[ 515 * 1508 ]; }
。