函数返回指向数组的分段错误

时间:2013-01-05 07:02:28

标签: c arrays pointers segmentation-fault

我正在开发一个简单的softmodem程序。调制解调器旨在实现拨号调制解调器的音频FSK,并且应该能够通过发出DTMF音调来发起电话呼叫。目前我遇到了一个会产生正弦值的函数的问题。

 double* generate_sine( int numberOfElements, double amplitude, 
 double phase_in_degrees, double numberOfCycles)
{
static int i;

double *sine_output;
sine_output = malloc( numberOfElements*sizeof(double) ); 

for( i=0; i<numberOfElements; i++ )
{

     sine_output[i] = (amplitude*sin(( (2.0*M_PI*i*numberOfCycles)/(double)numberOfElements )+
     ((M_PI*phase_in_degrees)/180 )));

   }
return sine_output; 
}

功能中存在分段错误。变量“i”似乎在循环的第一次迭代后成为指针,其值为4206692.sine_ptr也有一个有效的地址,直到循环的第二次迭代,此时它变为0(NULL)。 这是调用函数的位置。 DEFAULT_PHASE = 0.0

int main()
{
 int i;
     int numElements = 10;
 double* sine_ptr = generate_sine( numElements, 0.5, DEFAULT_PHASE, 440 );

  for( i=0; i<numElements; i++)
  {
    printf( "%e \n", *(sine_ptr + i ) );
  }
 free(sine_ptr);
 return 0;
}

在考虑了所有编辑后,我能够解决我的代码中的问题,非常感谢你给我的任何帮助。

1 个答案:

答案 0 :(得分:3)

编辑增加了另一点。

第1期

您为5个元素分配了足够的内存(numberOfElements为5)。然后,您尝试从初始点打印10个元素。最后5个元素将访问未分配的空间,并可能导致未定义的行为。包括分段错误。

第2期

您没有释放指向已分配空间的指针,而是放置10个位置的位置。如果解决分段错误,这也会导致其他问题。

第3期

这是次要的一个。但是sine_ptr为double,并且尝试将其显示为int未定义。 将导致编译器警告。即使有警告,数字也会下降。在您的情况下,输出将全部为零。要查看正确的结果,请使用%lf

使用以下代码。

int main()
{
  int i;
  int numElements = 5;
  double* sine_ptr = generate_sine( numElements, 0.5, DEFAULT_PHASE, 440 );
   for( i=0; i<numElements; i++)
   {
     printf( "%lf \n", *(sine_ptr + i) );
   }
   free(sine_ptr);
   return 0;
}