Frage einen lokalen Zeiger zurückgeben


struct node
{
  Item item; node *l, *r;
  node(Item x) {item = x; l = 0; r = 0;}
};

typedef node* link;
link max(Item a[], int l, int r)
{
    int m = (l+r)/2;
    link x = new node(a[m]);
    if (l==r) return x; // return a local pointer
    x->l = max(a, l, m);
    x-r = max(a, m+1, r);
    Item u = x->l->item, v = x->r->item;
    if (u>v) x->item = u;
    else x->item=v;

    return x;    // return a local pointer
}

Dies ist ein Stück Code aus "Algorithmus in C ++" von Robert Sedgewick, Seite 252, Programm 5.19. Und in Funktion max()Die zurückgegebene Variable ist ein Zeiger, der innerhalb der Funktion erstellt wird.

Meiner Meinung nach ist die Rückgabe eines lokalen Zeigers in C / C ++ nicht erlaubt. Meine Frage ist also: "Ist das in Ordnung, um eine Funktion wie diese zu schreiben?" Ich kann nicht glauben, dass so ein klassisches Buch Fehler macht. Oder habe ich das Prinzip missverstanden? Bitte helfen Sie. Vielen Dank.


7
2018-03-20 00:07


Ursprung


Antworten:


x ist kein "lokaler Zeiger" - also ein Zeiger auf eine lokale Variable. *x wurde mit zugewiesen new. x zeigt auf dynamisch zugewiesenen Speicher und die Rückgabe dieses Zeigers ist in Ordnung. Also ja, es ist in Ordnung, eine Funktion wie diese zu schreiben, und es gibt keinen Fehler im Buch.


5
2018-03-20 00:09



Es ist ein Fehler, einen Zeiger auf eine lokale Variable zurückzugeben. x zeigt auf eine Variable, die auf dem Heap zugeordnet ist:

link x = new node(a[m]);

So x zeigt nicht auf eine lokale Variable.

Der Grund dafür, dass ein Zeiger auf eine lokale Variable zurückgegeben wird, besteht darin, dass eine solche Variable nur so lange existiert, wie die Funktion aktiv ist (d. H. Zwischen der Eingabe und dem Verlassen). Variablen, die auf dem Heap zugeordnet sind (z. B. unter Verwendung des new Operator) existieren, bis sie freigegeben werden (z. B. mit der delete Operator).


3
2018-03-20 00:09



Das ist vollkommen in Ordnung, weil der Inhalt von x werden auf dem Heap zugewiesen, nicht auf dem Stapel. Sie könnten verwirrt werden, da es eine typedef node* link; darin, so dass es wie eine Stapelzuweisung aussieht, da es die Tatsache maskiert, dass x ist eigentlich ein node *.


1
2018-03-20 00:11