3 Stimmen

Grundlagen des Stapelspeichers

Betrachten Sie diesen Code:

 char* foo(int myNum) {
    char* StrArray[5] = {"TEST","ABC","XYZ","AA","BB"};

    return StrArray[4];
 }

Wenn ich zurückkehre StrArray[4] an den Aufrufer, soll das funktionieren? Da das Array auf dem Stack definiert ist, ist dieser Teil des Speichers aus dem Bereich herausgefallen, wenn der Aufrufer den Zeiger erhält. Oder wird dieser Code funktionieren?

8voto

Greg Hewgill Punkte 882617

Dieser Code wird funktionieren. Sie geben die Wert des Zeigers in StrArray[4] die auf eine konstante Zeichenkette verweist "BB" . Konstante Zeichenketten haben eine Lebensdauer, die der Ihres gesamten Programms entspricht.

Wichtig ist die Lebensdauer des Zeigers. a und nicht, wo der Zeiger gespeichert ist. Der folgende ähnliche Code würde zum Beispiel no Arbeit:

char* foo(int myNum) {
   char bb[3] = "BB";
   char* StrArray[5] = {"TEST","ABC","XYZ","AA",bb};

   return StrArray[4];
}

Dies liegt daran, dass die bb Array ist ein temporärer Wert auf dem Stack des foo() Funktion und verschwindet, wenn Sie zurückkehren.

4voto

pmg Punkte 102904

Vorsicht: Sie belügen den Compiler.

Jedes Element von StrArray zeigt auf eine *schreibgeschützt `char ** ; Sie teilen dem Compiler mit, dass der Rückgabewert Ihrer Funktion ein _abänderbar_char *` .
Wenn Sie den Compiler anlügen, wird er sich früher oder später dafür rächen.

In C ist die Deklaration eines Zeigers auf schreibgeschützt Daten zu qualifizieren, indem man sie mit const .

Ich würde den Code wie folgt schreiben:

const char* foo(int myNum) {
   const char* StrArray[5] = {"TEST","ABC","XYZ","AA","BB"};

   return StrArray[4];
}

2voto

AnT Punkte 300728

Der Code wird funktionieren. Der Punkt, den Sie zurückgeben ( StrArray[4] ) zeigt auf ein String-Literal "BB" . String-Literale in C sind anonyme Array-Objekte mit statische Speicherdauer Das bedeutet, dass sie so lange leben, wie Ihr Programm lebt (d. h. für immer). Es spielt keine Rolle, wo Sie das Sting-Literal erstellen. Selbst wenn es innerhalb einer Funktion eingeführt wird, hat es eine statische Speicherdauer.

Denken Sie nur daran, dass String-Literale nicht veränderbar sind, daher ist es besser, wenn Sie const char* Zeiger mit String-Literalen.

0voto

mmmmmm Punkte 31394

C verwendet Arrays mit Indizes, die bei 0 beginnen. Das erste Element ist also StrArray[0]

Daher wurde StrArray[5] in Ihrem Code nicht deklariert.

In C können Sie Code schreiben, der StrArray[5] zurückgibt, aber was dann passiert, ist undefiniert und hängt vom Betriebssystem und Compiler ab, führt aber oft zum Absturz des Programms.

0voto

Clifford Punkte 82130

Nur das Array von Zeigern liegt auf dem Stack, nicht die String-Literal-Konstanten.

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