下面的printResults()方法(从底部的main方法调用)为所有四个值返回-858993460。为什么是这样?我已经用cout语句证实了doCalc()方法中的数字和计算是正确的,所以我假设错误是我使用指针并调用printResults()方法的方式......
typedef int matrix[2][2] ;
struct matrices {
matrix a;
matrix b;
};
...getInput() method constructs
matrix* doCalc (matrices m){
matrix toReturn;
char input;
cout << "Which calculation would you like to perform - (M)ultiply, (A)dd, (S)ubtract?";
cin >> input;
switch(input){
case 'M':
toReturn[0][0] = ((m.a[0][0])*(m.b[0][0]));
cout << "XX " << ((m.a[0][0])*(m.b[0][0]));
toReturn[0][1] = (m.a[0][1]*m.b[0][1]);
cout << "YY " << (m.a[0][1]*m.b[0][1]);
toReturn[1][0] = (m.a[1][0]*m.b[1][0]);
toReturn[1][1] = (m.a[1][1]*m.b[1][1]);
break;
case 'A':
toReturn[0][0] = (m.a[0][0]+m.b[0][0]);
toReturn[0][1] = (m.a[0][1]+m.b[0][1]);
toReturn[1][0] = (m.a[1][0]+m.b[1][0]);
toReturn[1][1] = (m.a[1][1]+m.b[1][1]);
break;
case 'S':
toReturn[0][0] = (m.a[0][0]-m.b[0][0]);
toReturn[0][1] = (m.a[0][1]-m.b[0][1]);
toReturn[1][0] = (m.a[1][0]-m.b[1][0]);
toReturn[1][1] = (m.a[1][1]-m.b[1][1]);
break;
}
return &toReturn;
}
void printResult(matrix m){
cout<<"---RESULT---\n";
cout << m[0][0] << " " << m[0][1] << "\n";
cout << m[1][0] << " " << m[1][1] << "\n";
}
void main() {
matrices m = getInput();
cout << m.a[0][0] << " " << m.a[0][1] << "\n";
cout << m.a[1][0] << " " << m.a[1][1] << "\n\n";
cout << m.b[0][0] << " " << m.b[0][1] << "\n";
cout << m.b[1][0] << " " << m.b[1][1] << "\n";
matrix* calc = doCalc(m);
matrix c = &calc;
printResult(*calc);
}
答案 0 :(得分:2)
当函数退出时,矩阵toReturn
将被销毁,您将需要使用某种形式的持久性内存分配(查找 new 和 delete ) 。因此,所有的价值观都是无稽之谈。
答案 1 :(得分:0)
matrix toReturn;
是一个局部变量,在堆栈上分配。 doCalc
返回后,其内容未定义。在这种情况下,旧地址的内存会被随机垃圾覆盖。
答案 2 :(得分:0)
toReturn
将被堆栈帧销毁。
而不是返回指针将其传递给您正在调用的函数。
doCalc
答案 3 :(得分:0)
toReturn
是doCalc
函数中的局部变量。函数返回时它将不再存在。
解决此问题的一种简单方法是将引用传递给将存储结果的矩阵:
matrix* doCalc (matrices m, matrix& toReturn ){
然后从doCalc
matrix toReturn;
并改变函数的调用方式:
matrix* calc = doCalc(m);
matrix* calc = doCalc(m);
matrix c = &calc;
printResult(*calc);
对此:
matrix calc;
doCalc(m,calc);
printResult(calc);
还有其他方法可以解决此问题,例如:新建/删除其他地方的建议。但是,现在我们将分配谁分配和谁拥有内存。仅从功能签名中就不清楚谁负责什么。
答案 4 :(得分:0)
如果按值返回,您可以避免管理动态分配的内存并要求调用者提供左值。
matrix doCalc (const matrices& m)
{
matrix toReturn;
// Code here
return toReturn;
}
您可以将结果分配给matrix
对象,也可以在下面的表达式中使用它。
if(doCalc(m).a[0][0] == 1)
{
// do something
}
或
matrix mat(doCalc(m));
if(mat.a[0][0] == 1)
{
// do something
}