随机初始化一个结构体

Zah*_*ari -4 c++ struct segmentation-fault

我定义了两个结构。点和三角形,我想在主函数中用随机值初始化它们。但是这一行的编译器出了问题,停了下来。问题是什么?

#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;
}
Run Code Online (Sandbox Code Playgroud)

mol*_*ilo 8

您正在取消引用具有未定义行为的未初始化指针。

在这里使用指针没有意义 - 只需使用Points 作为成员。
这有几个好处:

  • 您无需担心“万事通”;它只是有效
  • 您可以编写不那么乏味的簿记代码,因此您有更多时间考虑不那么无聊的事情
  • 它更有可能更有效率(动态分配很慢)

然后添加几个函数,这样你就不需要复制和粘贴那么多了:

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();
}
Run Code Online (Sandbox Code Playgroud)