[英]Segmentation Fault in Function returning Pointer to Array
我正在研究一个简单的软调制解调器程序。 调制解调器被设计为实现拨号调制解调器的音频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期
您正在为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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.