Arrays 获取PrintArray()函数中的分段错误 类数组 { int-sizeX,sizeY; 整数**数组; 公众: 无效元素() { 对于(int i=0;i

Arrays 获取PrintArray()函数中的分段错误 类数组 { int-sizeX,sizeY; 整数**数组; 公众: 无效元素() { 对于(int i=0;i,arrays,pointers,segmentation-fault,Arrays,Pointers,Segmentation Fault,帮我解决这个问题 您正在构造函数中分配动态内存,但从未删除它。这是内存泄漏(但不是崩溃的原因) 您还忽略了实现复制构造函数和赋值运算符,违反了 现在来看实际问题:编译程序(添加缺少的#include)会产生: class Array { int sizeX, sizeY; int **array; public: void EnterElements() { for(int i = 0; i < sizeX; i++) {

帮我解决这个问题

您正在构造函数中分配动态内存,但从未删除它。这是内存泄漏(但不是崩溃的原因)

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

现在来看实际问题:编译程序(添加缺少的
#include
)会产生:

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;
}
这个警告来自这里:

t.cc:80:15: warning: reference to local variable ‘temp’ returned [-Wreturn-local-addr]
返回对局部变量的引用是错误的,因为只要
操作符*()
返回,引用就不会引用有效的对象,因此程序会显示未定义的行为

修复上述错误后,我们将进入下一个(难以发现的)错误:

void printary()
{
对于(int i=0;i
帮我解决这个问题

您正在构造函数中分配动态内存,但从未删除它。这是内存泄漏(但不是崩溃的原因)

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

现在来看实际问题:编译程序(添加缺少的
#include
)会产生:

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;
}
这个警告来自这里:

t.cc:80:15: warning: reference to local variable ‘temp’ returned [-Wreturn-local-addr]
返回对局部变量的引用是错误的,因为只要
操作符*()
返回,引用就不会引用有效的对象,因此程序会显示未定义的行为

修复上述错误后,我们将进入下一个(难以发现的)错误:

void printary()
{

对于(int i=0;i@ayushkapoor如果答案对你有帮助,请投票表决。如果答案回答了你的问题,请接受它作为答案。@ayushkapoor如果答案对你有帮助,请投票表决。如果答案回答了你的问题,请接受它作为答案。