1

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

}
4

5 回答 5

2

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

于 2013-05-07T01:21:16.530 回答
0

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

于 2013-05-07T01:23:38.387 回答
0

toReturn完成后将与堆栈帧一起销毁doCalc

与其返回指针,不如将其传递给您正在调用的函数。

void doCalc (matrices m, matrix* pReturnMatrix)

matrix* calc = new matrix();
doCalc(m, calc);
于 2013-05-07T01:27:51.503 回答
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);

还有其他方法可以解决此问题,例如其他地方建议的新建/删除。然而,现在我们将进入谁分配和谁拥有内存。仅从函数签名中并不清楚谁负责什么。

于 2013-05-07T01:29:43.480 回答
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
}
于 2013-05-07T01:33:14.893 回答