我定义了两个结构。点和三角形,我想用随机值在主函数中初始化它们。但是这一行的编译器遇到了麻烦并停止了。有什么问题吗?
#include <cmath>
#include <ctime>
struct Point{
double x;
double y;
double z;
};
struct Triangle{
Point* a;
Point* b;
Point* c;
};
int main() {
Triangle t1;
srand(time(0));
t1.a->x=10.0*(rand()/RAND_MAX)-5; //this line gives Segmentation fault
t1.a->y=10.0*(rand()/RAND_MAX)-5;
t1.a->z=10.0*(rand()/RAND_MAX)-5;
t1.b->x=10.0*(rand()/RAND_MAX)-5;
t1.b->y=10.0*(rand()/RAND_MAX)-5;
t1.b->z=10.0*(rand()/RAND_MAX)-5;
t1.c->x=10.0*(rand()/RAND_MAX)-5;
t1.c->y=10.0*(rand()/RAND_MAX)-5;
t1.c->z=10.0*(rand()/RAND_MAX)-5;
}
答案 0 :(得分:8)
您要取消引用具有未定义行为的未初始化指针。
在这里使用指针没有意义-只需使用Point
作为成员。
这有几个好处:
然后添加一些功能,因此您无需复制和粘贴太多:
struct Point{
double x;
double y;
double z;
};
struct Triangle{
Point a;
Point b;
Point c;
};
double random_value()
{
return (10.0*rand())/RAND_MAX - 5;
}
Point random_point()
{
return { random_value(), random_value(), random_value() };
}
Triangle random_triangle()
{
return { random_point(), random_point(), random_point() };
}
int main() {
srand(time(0));
Triangle t1 = random_triangle();
}
答案 1 :(得分:1)
如注释中所述,由于您编写的代码要求未初始化的Triangle t1
结构中每个指针指向的值,因此编译器生成的代码未由标准定义。这称为未定义行为,因为默认情况下没有明智的值来提供指针。我猜想,如果使用调试配置,则编译器将默认使用0值(这是不可访问的地址)初始化所述指针。
为了修复该程序,只需初始化t1的值,以使成员变量实际上指向有效的Point
。这些可以分配在堆栈或堆上,但必须分配。
要注意的另一件事是,您似乎对自己的问题没有太多的思考。为了将来,我将尝试对您所遇到的问题进行更多的测试,尝试自己解决这些问题,并且作为最后的选择,在堆栈溢出时在此处提出您的问题。提出问题时,请提供尽可能多的信息,尤其是尝试自行解决问题时发现的信息。谢谢;)