C++ 为什么此方法返回-858993460

C++ 为什么此方法返回-858993460,c++,pointers,C++,Pointers,下面的printResults()方法(从底部的main方法调用)为所有四个值返回-858993460。为什么会这样?我已经用cout语句确认了doCalc()方法中的数字和计算是正确的,所以我假设错误是在我使用指针和调用printResults()方法的过程中出现的 typedef int matrix[2][2] ; struct matrices { matrix a; matrix b; }; ...getInput() method constructs matrix* doC

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

}
typedef int矩阵[2][2];
结构矩阵{
基质a;
矩阵b;
};
…getInput()方法构造
矩阵*doCalc(矩阵m){
矩阵回归;
字符输入;
cout>输入;
开关(输入){
案例“M”:
toReturn[0][0]=((硕士[0][0])*(硕士[0][0]);

cout当函数退出时,矩阵
toReturn
将被销毁,您需要使用某种形式的持久内存分配(查找新的和删除的)因此,所有的值都是无意义的。

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

toReturn
将在
返回时与堆栈帧一起销毁>doCalc
已完成

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

void doCalc (matrices m, matrix* pReturnMatrix)

matrix* calc = new matrix();
doCalc(m, calc);

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);

还有其他方法可以解决此问题,例如,在其他地方建议使用new/delete。但是,现在我们将讨论谁分配内存以及谁拥有内存。仅从函数签名中不清楚谁负责什么。

您可以避免管理动态分配的内存,并在返回时要求调用者提供左值价值观

matrix doCalc (const matrices& m)
{
    matrix toReturn;

    // Code here

    return toReturn;
}
您可以将结果分配给
矩阵
对象,或在下面的表达式中使用它

if(doCalc(m).a[0][0] == 1)
{
     // do something
}


您返回一个指向局部变量的指针。函数返回该变量不再存在。<代码>空main <代码>是非标准的。它应该是新的C++,而不是Malc。查找“<代码>新< /COD>和<代码>删除<代码>。如果必须或可能按值返回。这里值最好。第二个地方是一个智能指针,因为它是清晰的。向调用者声明他们现在拥有内存,并且无论他们是否手动释放内存,内存都将被释放。@smitec我将在doCalc()方法内调用malloc,或在main方法中调用malloc?@CaptainObvlious但是我如何在C中按值返回数组?
matrix mat(doCalc(m));
if(mat.a[0][0] == 1)
{
     // do something
}