Выполнение программы остановлено из-за ошибки сегментации: 11 - PullRequest
0 голосов
/ 20 февраля 2019

Моя программа имеет дело с доступом к атрибутам структуры, которая определена внутри класса.Когда я использую указатель типа struct для отображения атрибутов структуры, он вызывает ошибку сегментации и останавливает выполнение.Хотя это хорошо для печати атрибутов структуры, если я просто использую переменную типа struct.Я попытался отладить код с помощью gdb, и он показывает, что ошибка сегментации происходит в строке 27, которая poly.params->a = 1;.Почему мы не можем использовать указатели в этом случае, или я делаю глупую ошибку?Вот пример кода:

#include <iostream>

using namespace std;

class QuadraticFunc
{
  public:
    QuadraticFunc(){};
    struct Coeff
    {
        double a;
        double b;
        double c;
    } * params;
    void ParamShow(const Coeff *params)
    {
        cout << "a: " << params->a << endl;
        cout << "b: " << params->b << endl;
        cout << "c: " << params->c << endl;
    }
    ~QuadraticFunc(){};
};

int main()
{
    QuadraticFunc poly;
    poly.params->a = 1;
    poly.params->b = 2;
    poly.params->c = 1;

    QuadraticFunc *polyPtr;

    polyPtr = &poly;

    cout << "The parameters for the first object: " << endl;
    polyPtr->ParamShow(poly.params);
}

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Почему мы не можем использовать указатели в этом случае, или я делаю глупую ошибку?

Да, вы.

QuadraticFunc poly;  // Your constructor leaves poly.params uninitialized
poly.params->a = 1;  // Dereferencing uninitialized pointer invokes undefined behavior.

Как мне это исправить?

Лучшее решение состоит в том, чтобы избегать указателя здесь:

class QuadraticFunc
{
  public:
    QuadraticFunc(){};
    struct Coeff
    {
        double a;
        double b;
        double c;
    } params;
    ...
 };

int main()
{
    QuadraticFunc poly;
    poly.params.a = 1;
    ...
    polyPtr->ParamShow(&poly.params);
}

У вас может быть уважительная причина иметь params в качестве указателя, ноВы еще не показали, что это может быть за причина.

0 голосов
/ 20 февраля 2019
poly.params->a = 1;

params не было инициализировано.

Заменить

struct Coeff
{
    double a;
    double b;
    double c;
} * params;

на

struct Coeff
{
    double a;
    double b;
    double c;
} params;

И затем заменить каждыйparams-> с params.

...