试图修复bug - 分段错误11

时间:2015-12-08 10:55:29

标签: c debugging segmentation-fault

我收到了这段代码:

 #include <stdio.h>
 #include <math.h>

 struct polar_coordinate{
   double theta;
   double r;
 };
 struct polar_coordinate * polar(double x, double y);

int main(void){
   double x = 2.0;
   double y = 3.0;
   struct polar_coordinate * pci;

   pci = polar(x,y);
   printf("The coordinate x = %.1f and y = %.1f is 
   in polar coordinates theta = %.2f and r = %.2f\n ",x,y,pci->theta,pci->r);
   }

struct polar_coordinate * polar(double x, double y){
   struct polar_coordinate pc;
   pc.r = sqrt(x*x + y*y);
   pc.theta = atan2(y,x);
   return &pc;
}

然后告诉我struct polar_coordinate * polar函数有一个bug,我必须修复。我试过这样做:

 struct polar_coordinate * polar(double x, double y){
   struct polar_coordinate * pc;
   pc->r = sqrt(x*x + y*y);
   pc->theta = atan2(y,x);
   return pc;
}

然后代码可以编译,但如果我尝试运行它,我会遇到分段错误11.但是我真的看不出应该是什么错误。

4 个答案:

答案 0 :(得分:1)

您正在尝试返回局部变量,因此您会收到分段错误错误,因此在使用后使用malloccallocfree分配动态内存。

使用更改工作代码....

#include <stdio.h>
#include <math.h>

struct polar_coordinate{
    double theta;
    double r;
};
struct polar_coordinate * polar(double x, double y);

int main(void){
    double x = 2.0;
    double y = 3.0;
    struct polar_coordinate * pci;

    pci = polar(x, y);
    printf("The coordinate x = %.1f and y = %.1f is in polar coordinates theta = %.2f and r = %.2f\n ",x,y,pci->theta,pci->r);

    if (pci)
        free(pci);  //free memory after use
}

struct polar_coordinate * polar(double x, double y){
    struct polar_coordinate *pc = malloc(sizeof (struct polar_coordinate)); //Dynamic memory allocation

    pc->r = sqrt(x*x + y*y);
    pc->theta = atan2(y, x);
    return pc;
}

答案 1 :(得分:0)

在此功能中

struct polar_coordinate * polar(double x, double y){
   struct polar_coordinate pc;
   pc.r = sqrt(x*x + y*y);
   pc.theta = atan2(y,x);
   return &pc;
}

您正在返回局部变量的地址,该函数将在函数返回时被销毁。 稍后在main()您尝试访问它

pc.r = sqrt(x*x + y*y);
pc.theta = atan2(y,x);

答案 2 :(得分:0)

在函数struct polar_coordinate * polar(double x, double y)中,您将返回polar_coordinate的本地实例,该实例将在函数范围的末尾被销毁。

你必须在返回之前分配你的返回变量。

答案 3 :(得分:0)

您正在返回一个指向本地变量的指针,该变量在函数返回时超出范围。但是,由于您使用的是未初始化的指针,因此修复会导致分段错误。这里有两种方法可以处理它(没有传递额外的参数)

struct polar_coordinate *polar(double x, double y){
    struct polar_coordinate * pc;
    pc = malloc(sizeof (struct polar_coordinate));
    if (pc == NULL)
        exit(1);
    pc->r = sqrt(x*x + y*y);
    pc->theta = atan2(y,x);
    return pc;
}

这将返回一个内存指针,调用者将不得不释放它,重复调用将导致内存泄漏。

另一种方法是使用静态局部变量。

struct polar_coordinate *polar(double x, double y){
    static struct polar_coordinate pc;
    pc.r = sqrt(x*x + y*y);
    pc.theta = atan2(y,x);
    return &pc;
}

此方法的缺点是后续调用该函数会覆盖struct