随机初始化结构

时间:2020-03-03 07:56:27

标签: 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;
}

2 个答案:

答案 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)

此代码包含UB!

如注释中所述,由于您编写的代码要求未初始化的Triangle t1结构中每个指针指向的值,因此编译器生成的代码未由标准定义。这称为未定义行为,因为默认情况下没有明智的值来提供指针。我猜想,如果使用调试配置,则编译器将默认使用0值(这是不可访问的地址)初始化所述指针。

为了修复该程序,只需初始化t1的值,以使成员变量实际上指向有效的Point。这些可以分配在堆栈或堆上,但必须分配。

要注意的另一件事是,您似乎对自己的问题没有太多的思考。为了将来,我将尝试对您所遇到的问题进行更多的测试,尝试自己解决这些问题,并且作为最后的选择,在堆栈溢出时在此处提出您的问题。提出问题时,请提供尽可能多的信息,尤其是尝试自行解决问题时发现的信息。谢谢;)