Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 返回数组指针的函数中出现分段错误_C_Arrays_Pointers_Segmentation Fault - Fatal编程技术网

C 返回数组指针的函数中出现分段错误

C 返回数组指针的函数中出现分段错误,c,arrays,pointers,segmentation-fault,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_out

我正在开发一个简单的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; 
}
double*生成正弦(整数个元素,双振幅,
双相位(单位:度,双循环数)
{
静态int-i;
双*正弦输出;
正弦输出=malloc(numberOfElements*sizeof(double));

对于(i=0;iEDIT添加了另一点

第1期

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

第2期

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

第3期

这是一个较小的问题。但是sine_ptr是双精度的,并且试图将其显示为未定义的
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;
}
intmain()
{
int i;
整数=5;
double*sine\u ptr=生成正弦(数值,0.5,默认相位,440);

对于(i=0;iEDIT添加了另一点

第1期

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

第2期

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

第3期

这是一个较小的问题。但是sine_ptr是双精度的,并且试图将其显示为未定义的
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;
}
intmain()
{
int i;
整数=5;
double*sine\u ptr=生成正弦(数值,0.5,默认相位,440);

对于(i=0;i未定义的行为。当
printf
需要一个int时,您正在传递一个double。我尝试指定希望printf()显示一个3.5%d的数字。程序在运行时冻结。“sine\u output”在函数“generate\u sine()”的循环过程中不知何故成为空指针.未定义的行为。当
printf
需要一个int时,您正在传递一个double。我尝试指定希望printf()显示一个3.5%d的数字。程序在运行时冻结。“sine\u output”在函数“generate\u sine()”的循环过程中不知何故成为空指针。为完整起见,请包括
printf
类型不匹配。UB不能太少。@potatosatter格式设置不会导致分段错误。可能是非法转换。但这些通常是警告,除非您要求,否则某些编译器甚至不会抱怨。程序仍然冻结。@user1505399这是什么意思eezes?分段错误消失了吗?@Pavan,根据C11 7.16.1.1/2(强调矿):如果没有实际的下一个参数,或者如果类型与实际的下一个参数的类型不兼容(根据默认参数提升),则行为未定义。。。(更多删节)。因此,您很可能看不到所有的零。为了完整性,请包含
printf
类型不匹配。UB不能太少。@potatosatter格式设置不会导致分段错误。可能是非法转换。但这些通常是警告,除非您要求,否则某些编译器甚至不会抱怨。程序仍然冻结。@user1505399冻结是什么意思?分段错误消失了吗?@Pavan,根据C11 7.16.1.1/2(emphasis mine):如果没有实际的下一个参数,或者如果类型与实际的下一个参数的类型不兼容,则使用double代替int是未定义的(根据默认参数提升),行为是未定义的…(更多删去)。因此,您很可能看不到所有零。