我正在尝试在C上编写一个数组(2x20000)。测试代码是:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double test( int smod )
{
//
// test subroutine
//
double vect_fma[2][20000];
int i;
// write on file //
FILE *f = fopen("file.txt", "w");
///////////////////
for( i = 1; i < 20001; i = i + 1 ){
// allocate the vector for the fma analysis
vect_fma[1][i] = i*smod;
vect_fma[2][i] = i*smod;
if ( i%smod == 0 )
fprintf(f, "%f %f %f \n", 1.0*i, vect_fma[1][i],vect_fma[2][i] );
}
fclose(f);
return 0;
}
int smod;
void main()
{
smod = 10; // every 10 print the output
test(smod); // call the function
}
我使用gcc test.c -lm -o test
编译了代码,并收到了Segmentation fault (core dumped)
。
就我在C上的新人而言,我理解“the compiler tries to store it on the stack”和解决方案可能是链接页面中提供的解决方案......但该解决方案看起来很奇怪(并且理解起来很复杂)如果与更简单的数组real(8), dimension(n:m) :: vect_fma
的fortran声明相比较,我可以将它放在子程序或函数中而不会出现问题。
也许我在代码中写的声明类似于fortran real(8), dimension(n,m),allocatable :: vect_fma
声明?
所以问题是,在C中存在一种更简单的方法来在函数内声明一个数组? 非常感谢大家。
答案 0 :(得分:2)
您在多个地方进行了界限访问,这是未定义的行为。
在C中,数组索引的范围从0
到N-1
,而不是从1
到N
。这意味着,将循环部分重写为:
for( i = 0; i < 20000; i = i + 1 ){
// allocate the vector for the fma analysis
vect_fma[0][i] = i*smod;
vect_fma[1][i] = i*smod;
if ( i%smod == 0 )
fprintf(f, "%f %f %f \n", 1.0*i, vect_fma[0][i],vect_fma[1][i] );
}
可能2x20000双倍可能对于系统上的堆栈大小来说太大了,你最好先修复未定义的行为 并查看问题是否消失。
答案 1 :(得分:2)
问题是你的for
循环。您应该以{{1}}的迭代开始,并以i=0
的迭代结束。您的代码以i=19999
的迭代开始,并以i=1
的迭代结束。
问题在于数组中没有第20000个元素,只有19999(零索引)。当您访问第20000个元素时,您访问的系统内存从未为您的程序分配,从而导致分段错误。
修复你的for循环,你应该很好。