Dies ist eine sehr grundlegende Frage, aber sie kann für Anfänger, die davon nichts wissen, ein Kopfzerbrechen sein. In C++ kann eine Funktion nicht direkt ein Array zurückgeben, aber ein Array ist im Wesentlichen ein Zeiger, also kann man die Funktion einen Zeiger zurückgeben lassen, um dies zu erreichen. Zum Beispiel können wir für eine Matrixmultiplikationsfunktion leicht schreiben:
Beispiel
using namespace std;
float* MultMatrix(float A[4], float B[4])
{
float M[4];
M[0] = A[0]*B[0] + A[1]*B[2];
M[1] = A[0]*B[1] + A[1]*B[3];
M[2] = A[2]*B[0] + A[3]*B[2];
M[3] = A[2]*B[1] + A[3]*B[3];
return M;
}
int main()
{
float A[4] = { 1.75, 0.66, 0, 1.75 };
float B[4] = {1, 1, 0, 0};
float *M = MultMatrix(A, B);
cout << M[0] << " " << M[1] << endl;
cout << M[2] << " " << M[3] << endl;
return 0;
}
Aber nach der Ausführung stellen wir fest, dass das Ergebnis lautet:
1.75 1.75 6.51468e-039 3.76489e-039
Dies ist nicht das gewünschte Ergebnis. Also fügen wir Anzeigecode innerhalb der Funktion hinzu, um zu sehen, ob es ein Berechnungsproblem ist, und wir erhalten das Ergebnis:
1.75 1.75 0 0 1.75 1.75 1.96875 1.75
Wir stellen fest, dass das Berechnungsergebnis korrekt ist, aber es ändert sich nach der Rückgabe und unterscheidet sich vom vorherigen Ergebnis. Warum ist das so?
Weil das in der Funktion definierte Array M vom System freigegeben wird, nachdem die Funktion ihre Ausführung beendet hat, ist das Ergebnis, das beim Aufruf der Funktion erhalten wird, natürlich nicht das berechnete Ergebnis. Eine Lösung besteht darin, Speicher dynamisch zuzuweisen, indem man new verwendet, um innerhalb der Funktion ein Array zu erstellen, damit es nicht freigegeben wird.
Also sollten wir ändern:
float M[4];
zu:
float *M = new float[4];
Nach der Änderung ergibt die Ausführung das Ergebnis:
1.75 1.75 0 0 1.75 1.75 0 0
Richtig. Allerdings haben wir den von uns zugewiesenen Speicher nicht freigegeben. Wenn wir ihn innerhalb der Funktion freigeben, wird das Ergebnis dasselbe sein wie am Anfang.
Schauen Sie sich unseren Aufrufcode an:
float *M = MultMatrix(A, B);
Dies setzt tatsächlich den M-Zeiger auf die erste Adresse des M-Arrays in der Funktion. Wir können den M-Zeiger freigeben, und die Wirkung ist dieselbe wie das Freigeben des zugewiesenen M-Arrays, weil sie auf denselben Speicherbereich zeigen. Der Code wird also wie folgt geändert:
Beispiel
using namespace std;
float* MultMatrix(float A[4], float B[4])
{
float *M = new float[4];
M[0] = A[0]*B[0] + A[1]*B[2];
M[1] = A[0]*B[1] + A[1]*B[3];
M[2] = A[2]*B[0] + A[3]*B[2];
M[3] = A[2]*B[1] + A[3]*B[3];
cout << M[0] << " " << M[1] << endl;
cout << M[2] << " " << M[3] << endl;
return M;
}
int main()
{
float A[4] = { 1.75, 0.66, 0, 1.75 };
float B[4] = {1, 1, 0, 0};
float *M = MultMatrix(A, B);
cout << M[0] << " " << M[1] << endl;
cout << M[2] << " " << M[3] << endl;
Löschen[] M;
return 0;
}
Ausführungsergebnis:
1.75 1.75 0 0 1.75 1.75 0 0
Kein Problem, der mit new zugewiesene Speicher wird ebenfalls freigegeben.
Aufgrund der unten stehenden Vorschläge der Experten habe ich das Programm wie folgt geändert. Schaut alle, ob es so akzeptabel ist:
Beispiel
using namespace std;
void MultMatrix(float M[4], float A[4], float B[4])
{
M[0] = A[0]*B[0] + A[1]*B[2];
M[1] = A[0]*B[1] + A[1]*B[3];
M[2] = A[2]*B[0] + A[3]*B[2];
M[3] = A[2]*B[1] + A[3]*B[3];
cout << M[0] << " " << M[1] << endl;
cout << M[2] << " " << M[3] << endl;
}
int main()
{
float A[4] = { 1.75, 0.66, 0, 1.75 };
float B[4] = {1, 1, 0, 0};
float *M = new float[4];
MultMatrix(M, A, B);
cout << M[0] << " " << M[1] << endl;
cout << M[2] << " " << M[3] << endl;
Löschen[] M;
return 0;
}
Überprüfungskommentare:
Erstens sollte das delete für ein Array delete[] sein.
Zweitens ist ein wichtiges Prinzip der manuellen Speicherzuweisung in C++, dass derjenige, der den Speicher zuweist, ihn auch freigeben sollte.
Deshalb solltest du new nicht verwenden, um innerhalb von MultMatrix ein Array zu erstellen; stattdessen solltest du es außerhalb allokieren und zur Änderung übergeben.
Um ein Array zurückzugeben, ist die Verwendung von etwas wie Smart-Pointern der richtige Weg.
Originaladresse: https://www.cnblogs.com/yangxi/archive/2011/09/18/2180759.html