2014-12-23 8 views
5

Nach meinem besten Verständnis wird der Stapel nach unten wachsen.Wächst mein Stapel nach oben statt nach unten?

Ich habe versucht, diesen Code auszuführen:

#include<stdio.h> 

void func(char* a1, int a2, int a3) { 

    char b1[10]; 
    int b2; 
    int b3; 

    printf("a3 address is: %p\n", &a3); 
    printf("a2 address is: %p\n", &a2); 
    printf("a1 address is: %p\n", &a1); 
    printf("-----------------------\n"); 
    printf("b1 address is: %p\n", &b1); 
    printf("b2 address is: %p\n", &b2); 
    printf("b3 address is: %p\n", &b3); 
} 


int main() { 
    func("string",2,3); 
    return 0; 
} 

Und das Ergebnis war nicht wie ich erwartet hatte:

a3 address is: 0x7fff68473190 
a2 address is: 0x7fff68473194 
a1 address is: 0x7fff68473198 
----------------------- 
b1 address is: 0x7fff684731b0 
b2 address is: 0x7fff684731a8 
b3 address is: 0x7fff684731ac 
ich b1, erwarte nicht, dass

b2, b3 im selben bestellt werden So habe ich sie erklärt. Ich verstehe, dass der Compiler diese Reihenfolge ändern kann, um Optimierungen und Alignment zu ermöglichen, aber warum scheint es, als ob der Stack zu hohen Adressen statt zu niedrigeren Adressen wächst?

+0

Sie Variablen in einem einzigen Stack-Rahmen, nicht einzelnen Stapelrahmen zu vergleichen ... –

Antwort

4

tl; dr Mit dem Code in Ihrer Frage können wir nicht sagen.

Die Reihenfolge, in der lokale Variablen auf dem Stapel erscheinen ist an den Compiler auf. Es könnte Dinge neu anordnen, oder es würde sogar keinen Stack-Platz für bestimmte Variablen zuweisen (weil sie weg optimiert wurden oder Registern zugewiesen wurden).

Der Weg Funktion Argumente werden auf den Stapel geschoben - wenn überhaupt! - wird von ABI Ihrer Plattform diktiert. In meinem Fall (x86-64) werden die drei Argumente in Registern übergeben (%edi, %esi und %edx):

main: 
     ... 
     movl $3, %edx 
     movl $2, %esi 
     movl $.LC7, %edi 
     call func 

Um den Code zu kompilieren, die die Adressen von a1, a2 und a3 nimmt der Compiler aus dem Weg zu gehen, um die Werte der drei Register zu speichern, was effektiv drei unbenannte lokale Variablen:

func: 
     ... 
     movq %rdi, -56(%rbp) 
     movl %esi, -60(%rbp) 
     movl %edx, -64(%rbp) 

Zusammenfassend ist der Code in Ihrer Frage nicht ausreichend zu dem Schluss, welchen Weg der Stapel wächst.

Zum Glück wissen wir, diese Art der Sache, a priori oder können es heraus unterschiedlichen Code aus: What is the direction of stack growth in most modern systems?

Verwandte Themen