我收到了这段代码:
#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.但是我真的看不出应该是什么错误。
答案 0 :(得分:1)
您正在尝试返回局部变量,因此您会收到分段错误错误,因此在使用后使用malloc
或calloc
和free
分配动态内存。
使用更改工作代码....
#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
。