数组声明:C分段错误

时间:2016-07-18 18:34:09

标签: c arrays file-io

我正在尝试在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中存在一种更简单的方法来在函数内声明一个数组? 非常感谢大家。

2 个答案:

答案 0 :(得分:2)

您在多个地方进行了界限访问,这是未定义的行为。 在C中,数组索引的范围从0N-1,而不是从1N。这意味着,将循环部分重写为:

   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循环,你应该很好。