arrays - 在 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 将两个矩阵相乘但出现分段错误。我正在使用双指针。请帮我解决这个问题。此外,我们将不胜感激对代码的任何建议/改进。
解决方案
帮我解决这个问题
您在构造函数中分配动态内存,但永远不要删除它。那是内存泄漏(但不是导致崩溃的原因)。
您还忽略了实现复制构造函数和赋值运算符,违反了三规则。
现在到实际问题:编译程序(在添加 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;
}
}
推荐阅读
- c# - C# gRPC 使用截止日期而不是取消令牌
- laravel - 测试工匠控制台命令时在整数上调用成员函数 expectsOutput()
- r - 如何使用 R 对 PostGIS 数据库查询进行单元测试
- postgresql - Postgres upsert 避免第二个唯一约束?
- python - 致命的 Python 错误:无法从堆栈溢出中恢复。在蟒蛇
- javascript - 在 React 中创建可重新排序的卡片组件
- java - 动态获取 Intellij IDEA (maven) 的内部版本号
- pybind11 - 使用 pybind11 绑定数组
- javascript - 检查用户是否在 Firestore 云功能中是匿名的
- javascript - 收到以下错误:compare.js:1 未捕获的错误:找不到模块“ember”