4 Stimmen

Zurückgeben von Zeigern c

Mögliche Duplikate:
Zeiger auf lokale Variable
Kann auf den Speicher einer lokalen Variablen außerhalb ihres Gültigkeitsbereichs zugegriffen werden?

Ich habe ein interessantes Problem. Ich habe eine Lese-Funktion, die einen Zeiger zurückgibt:

char * myReadFunc() {   
    char r [10];
    //Einige Code, der Daten in r liest.
    return r;
}

Jetzt rufe ich diese Funktion auf, um Informationen einigen Variablen zuzuweisen, die ich habe:

char * s;
//Einige Code, um anzugeben, von wo aus gelesen werden soll.
s = myReadFunc();

Das liefert Ergebnisse, wie ich es beabsichtigt habe.

Wenn ich jedoch Folgendes mache:

char * s1;
char * s2;
//Einige Code, um anzugeben, von wo aus gelesen werden soll.
s1 = myReadFunc();
//Einige Code, um den Leseort zu ändern.
s2 = myReadFunc();

Erhalte ich einige seltsame Ergebnisse. Die Daten sind identisch für beide, und sie stammen IMMER vom zweiten angegebenen Leseort.

Also habe ich einige alternative Codes ausprobiert:

char * s1;
char * s2;
//Einige Code, um anzugeben, von wo aus gelesen werden soll.
char r [10];
//Einige Code, der Daten in r liest. IDENTISCH zu myReadFunc().
s1 = r;
//Einige Code, um den Leseort zu ändern.
s2 = myReadFunc();

Dieser Code liefert Ergebnisse, wie ich es beabsichtigt habe (s1 enthält Daten aus einem Ort und s2 enthält Daten aus einem anderen).

Also ist meine Frage, warum hat der letzte Code funktioniert, aber der obige Code nicht? Meine Vermutung ist, dass meine Funktion irgendwie beiden Variablen zugeordnet war und da sie auf beide zeigte, sie bei jedem Aufruf beide neu zugewiesen hat. Versteht jemand den genauen Grund für dieses Verhalten?

8voto

pb2q Punkte 56919

Ihre readFunc-Funktion funktioniert nicht wie erwartet.

Sie geben einen Zeiger auf ein Array zurück, das nur im Bereich Ihrer Funktion definiert ist. Nachdem die Funktion beendet wurde, geht das Array außerhalb des Gültigkeitsbereichs und spätere Zugriffsversuche auf diesen Speicher führen zu undefiniertem Verhalten. Es kann scheinbar unter bestimmten Umständen funktionieren, ist aber inkorrekt.

Stattdessen sollten Sie in readFunc das Array auf dem Heap mit new oder malloc allozieren:

// Es liegt in der Verantwortung des Aufrufers, das
//    zurückgegebene Puffer mit delete[] zu löschen, es ist jedoch vorzuziehen, z. B. shared_ptr zu verwenden
char *myReadFunc()
{
    char *r = new char[BUFFER_SIZE];
    //einige Codezeilen, die Daten in r einlesen.
    return r;
}

2voto

nav_jan Punkte 2423

Es kann kein festgelegtes Verhalten dafür geben, was du versuchst zu tun, weil du versuchst, auf den Speicher zuzugreifen, auf den ein Array zeigt, dessen Lebensdauer vorbei ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X