2014-10-29 8 views
10

Ich versuche, den Wert der lokalen Variablen durch eine andere aufgerufene Funktion zu ändern, aber ich bin nicht in der Lage herauszufinden, was alle Werte auf den Stapel geschoben werden.Welche Werte werden während eines Funktionsaufrufs auf den Stapel geschoben?

#include <stdio.h> 
#include <string.h> 

void fun() 
{ 
    int i; 
    int *p=&i; 
    int j; 
    for(j=0;*(p+j)!=10;j++); 
    printf("%d",j); 
    /* Stack Frame size is j int pointers. */ 
    *(p+j)=20; 
}  

main() 
{ 
    int i=10; 
    fun(); 
    printf("\n %d \n",i); 
} 

Wie genau funktioniert j in fun() gleich 12? Ich versuche zu verstehen, welche Werte auf den Stapel geschoben werden. Genauer gesagt, können wir den Wert von i ändern, der in main() ohne Verwendung einer for Schleife in fun() ist und ist es möglich, den Wert j innerhalb fun() vorauszusagen?

+0

Dies sollte Ihr Problem beheben. http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope –

+2

Es könnte einfacher sein. 'void Spaß (int * ip) { * ip = 20; } int main() { int i = 10; fun (&i); } ' –

+2

@RSahu. Der Zweck der Frage zu verstehen ist, welche Werte auf den Stapel geschoben werden – debonair

Antwort

3

wenn Sie lokalen Zugriff auf Variablen Von anderen Funktionsaufrufen denke ich, dass Sie Ihren Code besser umgestalten sollten.

Theoretisch kann man direkt die i von main() in fun() zu ändern, wenn Sie vollständig verstehen können, wie die Compiler befassen sich mit den Aktivierungs Aufzeichnungen Funktion auf dem Laufzeitstapel nennt. Einzelheiten (http://www.amazon.com/Compilers-Principles-Techniques-Tools-Edition/dp/0321486811)

enter image description here

Der Wert von j ist abhängig von der Laufzeitstapeladresse zwischen den int i; im Spaß() und int i = 10; in: Sie können „Prinzipien, Techniken und Werkzeuge Compiler“ lesen Haupt(). In diesem Fall, wenn fun() aufgerufen wird, ist ihre relative Entfernung auf dem Stack nur 12. Deshalb ist die 12. So hat die *(p + j) = 20; tatsächlich die i des main() geändert. Wenn Sie Ihren Code ändern, indem Sie wie folgt int a = 14; hinzufügen, finden Sie den Wert von j geändert für den Aktivierungseintrag auf dem Laufzeitstack geändert wurde.

#include <stdio.h> 

void fun() 
{ 
    int i; 
    int *p=&i; 
    int j; 
    for(j=0;*(p+j)!=10;j++); 
    printf("%d",j); 
    /* Stack Frame size is j int pointers. */ 
    *(p+j)=20; 
} 

main() 
{ 
    int i=10; 
    int a=14; /* add this for example to change the relative address i in the main and i in the fun*/ 
    fun(); 
    printf("\n %d \n",i); 
} 
+0

"im Spaß werde ich mit 0 initialisiert, wenn du ihm nicht explizit etwas zuordnest" - nein, wird es nicht. Der Wert ist undefiniert und in den meisten Implementierungen wird der Müll im Stapelspeicherort oder in dem Register, das zum Halten von "i" verwendet wird, verwendet. Wenn es 10 ist, dann wird j 0. Der Rest von dem, was Sie geschrieben haben, ist zu gewunden, als dass ich ihn analysieren könnte. –

+0

@ JimBalter: Ja, Sie haben Recht. Ich werde mein Bestes versuchen, um meine Idee gut auszudrücken, und ich habe die Antwort bearbeitet. –

+0

Upvote für nette Verbindung .. – debonair

0

Hier in fun()

  • i enthält 0 oder eine garbage Wert
  • p enthält die Adressen von i

In der for-Schleife j anfänglich 0 ist und die für die Schleife wird ausgeführt, bis Der Wert in der Adresse p+j !=10 und j wird erhöht.

So gibt es keine Möglichkeit, richtig, das Ergebnis des Drucks in fun()

vorhersagen und auch vor dem aus immer fun() Sie versuchen, 20 auf den Speicherplatz zuweisen p=j wobei j eine beliebige value [0,+infinity) keine Möglichkeit sein könnte, richtig

mittlerweile der Druck func in Haupt erzählen() wird Wert lokaler i angezeigt, die 10 ist, dass, wenn die Adresse der i in main() ist nicht gleich to p+j

+1

Sie verpassen den OP-Code. Er ordnet 'p' eine Stapeladresse zu und durchsucht dann den Stapel, bis er den Wert' 10' findet, was vermutlich den Versatz zwischen der lokalen Variablen 'i' in fun und der lokalen Variablen' i' in main ergibt von diesen Variablen sind auf dem Stapel, es gibt keine andere Instanz von "10" auf dem Stapel dazwischen und der Stapel wächst nach unten. –

Verwandte Themen