In dieser Funktion
char* pass(char* p){
char* a = new char[10];
a[0] = 'S';
a[1] = 'e';
a[2] = 'r';
a[3] = 'g';
a[3] = 'e';
a[3] = 'y';
a[4] = '\0';
p = a;
//delete [] a;
return p;
}
der Parameter ist eine lokale Variable der Funktion. Nach dem Beenden der Funktion wird es zerstört.
Sie können die Funktion und seine Forderung vorstellen, die
pass(p2);
char* pass(/*char* p*/){
char* p = p2;
char* a = new char[10];
a[0] = 'S';
a[1] = 'e';
a[2] = 'r';
a[3] = 'g';
a[3] = 'e';
a[3] = 'y';
a[4] = '\0';
p = a;
//delete [] a;
return p;
}
folgende Art und Weise, wie Sie den ursprünglichen Zeiger p2
sehen nicht in der Funktion geändert werden. Die Funktion ändert ihre lokale Variable , die als Parameter deklariert ist.
Wenn Sie die Löschanweisung auskommentieren, wird der Speicher, auf den der Rückgabewert verweist, gelöscht und der zurückgegebene Zeiger ist ungültig. aufgrund Aussage
cout << pass(p2) << endl;
In diesem Fall hat das Programmverhalten nicht definiert, wo ein Versuch, es gibt die gelöschte Speicher mit dem Rückgabewert der Funktion zuzugreifen.
Es ist also nicht sinnvoll, Zeiger auf gelöschten Speicher zurückzugeben.
Was Sie tun möchten, können auf drei Arten
Die erste erreicht werden, den Parameter als Referenz
char* pass(char* &p){
^^^^^^^^
char* a = new char[10];
a[0] = 'S';
a[1] = 'e';
a[2] = 'r';
a[3] = 'g';
a[3] = 'e';
a[3] = 'y';
a[4] = '\0';
p = a;
return p;
}
und rufen Sie die Funktion wie
cout << pass(p2) << endl;
Die zweite erklären Eine besteht darin, den Parameter als Zeiger auf einen Zeiger zu deklarieren, der den ursprünglichen Zeiger indirekt akzeptiert
char* pass(char* *p){
^^^^^^^^
char* a = new char[10];
a[0] = 'S';
a[1] = 'e';
a[2] = 'r';
a[3] = 'g';
a[3] = 'e';
a[3] = 'y';
a[4] = '\0';
*p = a;
^^^^^^^^
return *p;
^^^^^^^^^^
}
und rufen Sie die Funktion wie
cout << pass(&p2) << endl;
Und endlich konnte man einfach den Rückgabewert auf den ursprünglichen Zeiger zuweisen. Zum Beispiel
char* pass(char* p){
char* a = new char[10];
a[0] = 'S';
a[1] = 'e';
a[2] = 'r';
a[3] = 'g';
a[3] = 'e';
a[3] = 'y';
a[4] = '\0';
p = a;
return p;
}
und rufen die functionj wie
cout << (p2 = pass(p2)) << endl;
obwohl in diesem Fall ist der Parameter obsolet.
In jedem Fall sollten Sie die zugewiesenen Speicher am Ende des Programms wie
delete [] p2;
'p = a löschen;' nicht die Werte kopieren, wie Sie vielleicht denken. – DimChtz
Sie sollten wirklich auf Zeiger und Speicherverwaltung in C++ auffrischen. Es scheint, dass es zu viel ist, was du nicht verstehst, damit eine Antwort effektiv ist. –
Und deshalb sollten Sie 'std :: stirng' verwenden und sich die Implementierung um die Zuweisung und das Kopieren kümmern. – NathanOliver