首页 > 解决方案 > 在 PrintArray() 函数中出现分段错误

问题描述

class Array
{
    int sizeX, sizeY;
    int **array;

public:

    void EnterElements()
    {
        for(int i = 0; i < sizeX; i++)
        {
            cout << "Enter Elements Of Row:" << i+1 <<endl;
            for(int j = 0; j < sizeY; j++)
            {
                cin >> array[i][j];
            }
        }
    }

    Array()
    {
        sizeX = sizeY = 2;

        array = new int*[sizeX];
        for(int i = 0; i<sizeX; i++)
        {
            array[i] = new int[sizeY];
        }
    }

    Array(int x, int y)
    {
        sizeX = x;
        sizeY = y;

        array = new int*[sizeX];
        for(int i = 0; i<sizeX; i++)
        {
            array[i] = new int[sizeY];
        }
    }

    Array(Array &t)
    {
        sizeX = t.sizeX;
        sizeY = t.sizeY;

        array = new int* [sizeX];
        for(int i = 0; i<sizeX; i++)
        {
            array[i] = new int [sizeY];
        }

        for(int i = 0; i<sizeX; i++)
        {
            for(int j = 0; j<sizeY; j++)
            {
                array[i][j] = t.array[i][j];
            }
        }
    }

    void PrintArray()
    {
        for(int i = 0; i<sizeX; i++)
        {
            for(int j = 0; i<sizeY; j++)
            {
                cout << (int)array[i][j] << "\t";
            }
            cout << endl;
        }
    }

    Array& operator *(Array array2)
    {
        Array temp(this->sizeY, array2.sizeX);

        if(this->sizeY != array2.sizeX)
        {
            cout << "Cant Multiply" << endl;
            return temp;
        }

        for(int i = 0; i < sizeX; i++)
        {
            for(int j = 0; j < sizeY; j++)
            {
                for(int k = 0; k < sizeX && k < sizeY; k++)
                {
                    temp.array[i][j] += this->array[i][k]*array2.array[k][j];
                }
            }
        }

        return temp;
    } 
};

int main()
{
    Array a(3,3), b(3,3);
    a.EnterElements();
    b.EnterElements();

    a.PrintArray();
    b.PrintArray();
    Array c(a*b);
    c.PrintArray();

    return 0;
}

尝试使用 oop 将两个矩阵相乘但出现分段错误。我正在使用双指针。请帮我解决这个问题。此外,我们将不胜感激对代码的任何建议/改进。

标签: arrayspointerssegmentation-fault

解决方案


帮我解决这个问题

您在构造函数中分配动态内存,但永远不要删除它。那是内存泄漏(但不是导致崩溃的原因)。

您还忽略了实现复制构造函数和赋值运算符,违反了三规则

现在到实际问题:编译程序(在添加 missing 之后#include)会产生:

t.cc:80:15: warning: reference to local variable ‘temp’ returned [-Wreturn-local-addr]

这个警告来自这里:

   Array& operator *(Array array2)
    {
        Array temp(this->sizeY, array2.sizeX);
...
        return temp;
    }

返回对局部变量的引用是不好的,因为该引用不会在operator*()返回后立即引用有效对象,因此您的程序会表现出未定义的行为。

修复上述错误,我们来到下一个(难以发现):

    void PrintArray()
    {
        for(int i = 0; i<sizeX; i++)
        {
            for(int j = 0; i<sizeY; j++)   // wrong variable used for loop limit (should be j)
            {
                cout << (int)array[i][j] << "\t";
            }
            cout << endl;
        }
    }

推荐阅读