为什么这个方法返回-858993460

时间:2013-05-07 01:18:38

标签: c++ pointers

下面的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);

}

5 个答案:

答案 0 :(得分:2)

当函数退出时,矩阵toReturn将被销毁,您将需要使用某种形式的持久性内存分配(查找 new delete ) 。因此,所有的价值观都是无稽之谈。

答案 1 :(得分:0)

matrix toReturn;是一个局部变量,在堆栈上分配。 doCalc返回后,其内容未定义。在这种情况下,旧地址的内存会被随机垃圾覆盖。

答案 2 :(得分:0)

<{1}}完成后,

toReturn将被堆栈帧销毁。

而不是返回指针将其传递给您正在调用的函数。

doCalc

答案 3 :(得分:0)

toReturndoCalc函数中的局部变量。函数返回时它将不再存在。

解决此问题的一种简单方法是将引用传递给将存储结果的矩阵:

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
}