Wie der Zugriff auf eine lokale variable aus einer anderen Funktion mit Zeigern?
Kann ich keinerlei Zugriff auf eine lokale variable in einer anderen Funktion? Wenn ja, wie?
void replaceNumberAndPrint(int array[3]) {
printf("%i\n", array[1]);
printf("%i\n", array[1]);
}
int * getArray() {
int myArray[3] = {4, 65, 23};
return myArray;
}
int main() {
replaceNumberAndPrint(getArray());
}
Die Ausgabe von dem code oben:
65
4202656
Was mache ich falsch? Was bedeutet das "4202656" bedeuten?
Muss ich kopieren, das ganze array in die replaceNumberAndPrint()
- Funktion, um in der Lage sein, darauf zuzugreifen mehr als beim ersten mal?
Schwer zu wissen, den besten Vorschlag für Ihre Absicht, hier. Aber möchten Sie vielleicht zu Lesen, auf shared-Pointer (shared_ptr und Freunde). Sie bieten einige der schönen Eigenschaften der Müll gesammelt Sprachen-by-doing-Referenz zählen. Aber anders, also Vorsicht.
Ich Stimme zu, diese wieder zu öffnen, und verwenden Sie es als eine kanonische doppelte für Fragen von der Art "ich bin immer ein crash wenn wieder ein Zeiger auf lokale variable,, warum?", anstatt anderen klassischen kanonischen duplizieren, die eher für den "ich bin nicht immer ein Absturz, warum nicht?"
ein bisschen problematisch ist, dass dies sowohl in C und C++.
Es gibt nichts einzigartiges zu C++ in Frage, aber leider gibt es in C++ Antworten, damit der tag hat zu bleiben.
Ich Stimme zu, diese wieder zu öffnen, und verwenden Sie es als eine kanonische doppelte für Fragen von der Art "ich bin immer ein crash wenn wieder ein Zeiger auf lokale variable,, warum?", anstatt anderen klassischen kanonischen duplizieren, die eher für den "ich bin nicht immer ein Absturz, warum nicht?"
ein bisschen problematisch ist, dass dies sowohl in C und C++.
Es gibt nichts einzigartiges zu C++ in Frage, aber leider gibt es in C++ Antworten, damit der tag hat zu bleiben.
InformationsquelleAutor Radek Simko | 2010-12-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
myArray
ist eine lokale variable und somit der Zeiger ist nur solange gültig, bis das Ende des Bereichs (das ist in diesem Fall, die FunktiongetArray
) ist Links. Wenn Sie später wieder darauf zugreifen bekommst du Undefiniertes Verhalten.In der Praxis was passiert, ist, dass der Aufruf zu
printf
überschreibt den Teil des Stacks verwendetmyArray
und es enthält dann einige andere Daten.Reparieren Ihre Codes müssen Sie entweder deklarieren Sie das array in einen Bereich, der lebt lange genug (die
main
Funktion in deinem Beispiel) oder um Speicher auf dem heap. Wenn Sie sich um Speicher auf dem heap, die Sie brauchen, um frei es entweder manuell, oder in C++ mit RAII.Einer alternative, die ich übersehen (wahrscheinlich sogar das beste hier, sofern das array nicht zu groß) ist, um wickeln Sie Ihre array in ein struct und damit es einen Wert geben. Dann wieder es wird eine Kopie erstellt, die überlebt die Funktion zurück. Sehen tp1's Antwort für details.
Macht es statisch hat ganz andere Semantik, vor allem in multi-threaded-Anwendungen, es sei denn, der Inhalt des Arrays ist konstant.
Sicher, aber es ist ein Weg, um das problem zu lösen und Sie sollten darauf hingewiesen werden, richtig?
Hinweis es ist natürlich nützlich, aber Sie müssen darauf hinweisen, die Kehrseite zu, so dass Ihr Erster Kommentar war ein bisschen unvollständig.
Ich würde sagen, die Empfehlung
static
als eine Lösung für dieses problem ist schädlich und niemals hilfreich. Für Neulinge wird es eine formulatic band-aid statt wirklich das problem zu verstehen und zu schreiben richtigen code, und später, wenn jemand anderes übernimmt die newbie-code, Sie werden entsetzt auf all die unsinnigen statische Variablen, die alle über dem Platz.InformationsquelleAutor CodesInChaos
Können Sie keinen Zugriff auf eine lokale variable, sobald es den Bereich verlässt. Dies ist, was es bedeutet, eine lokale variable.
Beim Zugriff auf das array in der replaceNumberAndPrint Funktion, ist das Ergebnis undefiniert. Die Tatsache, dass es zu funktionieren scheint zunächst mal nur ein glücklicher Zufall. Wahrscheinlich ist der Speicherplatz, den Sie zeigen nicht zugeordnet auf dem Stapel und ist noch richtig gesetzt für den ersten Anruf, aber der Aufruf von printf () dann überschreibt diese durch drücken der-Werte auf dem Stapel während des Betriebs, das ist der Grund, warum der zweite Aufruf von printf zeigt etwas anderes.
Müssen Sie zum speichern der array-Daten auf dem heap, und übergeben Sie einen Zeiger oder eine variable, die bleibt im Rahmen (z.B. eine Globale oder etwas Gültigkeitsbereich innerhalb der main-Funktion).
InformationsquelleAutor James Gaunt
Versuchen Sie so etwas wie, dass. Die Art und Weise Sie tun es "tötet"
myArray
verursachen, wenn es lokal definiert.Mehr : http://www.cplusplus.com/reference/clibrary/cstdlib/malloc/
Edit: Als Kommentare richtig darauf hingewiesen: Ein besserer Weg, es zu tun wäre :
main
und lassen Sie es, wenn es nicht mehr benötigt wird.dies ist wahr, auch dieses Stück code ist sehr naiv, weil es nicht überprüfen, ob
malloc()
erfolgreich zugeordnet wurde. Aber ich denke OP wird verstehen, der springende Punkt.Während dies funktioniert, es ist hässlich. Ändern Sie die Funktion Namen(
getArray
=>createArray
) zu beschreiben, deren Verhalten besser. Und mitreplaceNumberAndPrint
löschen des Quell-Arrays nicht wie eine gute Idee scheint mir. Ich würde eher zu trennen, löschen und drucken in zwei verschiedenen Funktionen.Hinzugefügt eine "Richtige" version.
nicht Sie lieber
array[i]
statt*(array+i)
?InformationsquelleAutor Muggen
myArray geht out of scope, sobald Sie aus getArray. Sie müssen Speicherplatz auf dem heap statt.
InformationsquelleAutor John Pickup
Dein code ruft Undefiniertes Verhalten, weil
myArray
geht out of scope, sobaldgetArray()
gibt, und jeder Versuch verwenden (dereferenzieren) die baumelnden Zeiger UB.InformationsquelleAutor Prasoon Saurav
Lokale Variablen Gültigkeitsbereich nach der Rückkehr, so dass Sie nicht mehr zurück können, einen Zeiger auf eine lokale variable.
Müssen Sie sich um Speicher dynamisch (auf dem heap), mit
malloc
odernew
. Beispiel:Alternativ können Sie declare das array als statische, unter Berücksichtigung der Semantik unterschiedlich sind. Beispiel:
Wenn Sie nicht wissen, was
static
bedeutet, Lesen Sie diese Frage & Antwort.InformationsquelleAutor jweyrich
Richtige Weg, dies zu tun ist wie folgt:
Zu verstehen, warum Sie brauchen, um dies zu tun, müssen Sie wissen, wie sizeof(array) funktioniert. C (und damit auch c++) hart versucht zu vermeiden, kopieren Sie das array, und Sie müssen die struct zu gehen, dass Vergangenheit. Warum das kopieren ist erforderlich, weil mit den Bereichen -- die get_array () - Funktion des scope verschwindet und jeder Wert noch benötigt von diesem Umfang kopiert werden müssen, um aufrufenden Bereichs.
typedef
oder die Zuordnung der Struktur wiestruct Arr a
?In C, ja. In C++
struct Foo { ... };
definiert automatisch die Typenstruct Foo
undFoo
keinetypedef
benötigt.InformationsquelleAutor tp1
In diesem code hast du verwendet Zeiger auf lokale Objekte aber, wenn eine Funktion alle lokalen Variablen, die außerhalb des Gültigkeitsbereichs. Wenn Sie Speicher zuweisen (mit
malloc()
Funktion für die Zuweisung), dann werden keine Daten verloren gehen oder überschrieben werden.Dieser code druckt alle Elemente des Arrays und nicht überschrieben werden passiert.
Danke Mat für mich zu sagen...
InformationsquelleAutor aquib23
C++ - Lösung:
Die Antwort ist Nein, auch nicht, nachdem die Funktion beendet wurde. Lokale Variablen werden zerstört.
In
C++
den Umgang mit der Rückgabe von arrays ist, Sie zu verwalten in einer container wie ein std::array (Feste Größe) oder eine std::vector (dynamische Größe).ZB:
In der zweiten Funktion ist der zurückgegebene Wert wird optimiert durch den compiler, so dass Sie nicht den Preis zahlen, der eigentlich kopieren der array.
InformationsquelleAutor Galik