2014-12-23 2 views
5

К моему лучшему пониманию, стек предположительно будет расти вниз.Увеличивает ли мой стек вверх, а не вниз?

Я попытался запустить этот код:

#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; 
} 

И результат не был, как я ожидал:

a3 address is: 0x7fff68473190 
a2 address is: 0x7fff68473194 
a1 address is: 0x7fff68473198 
----------------------- 
b1 address is: 0x7fff684731b0 
b2 address is: 0x7fff684731a8 
b3 address is: 0x7fff684731ac 

Я не ожидаю b1, b2, b3 заказываются в том же Я объявил их. Я понимаю, что компилятор может изменить этот порядок, чтобы включить оптимизацию и выравнивание, но почему кажется, что стек растет по направлению к высоким адресам, а не к более низким адресам?

+0

Вы сравнение переменных в пределах одного фрейма стека, а не отдельные стеки рама ... –

ответ

4

tl; dr Используя код в своем вопросе, мы не можем сказать.

Порядок, в котором Локальные переменные отображаются в стеке, зависит от компилятора. Он может изменять порядок вещей или даже не выделять пространство стека для определенных переменных (поскольку они были оптимизированы или распределены на регистры).

Путь аргументы функции вставляются в стек - если вообще! - диктуется вашей платформы. В моем случае (x86-64), три аргумента передается в регистрах (%edi, %esi и %edx):

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

Для того, чтобы скомпилировать код, который принимает адрес a1, a2 и a3, компилятор должен выйти из своего пути, чтобы сохранить значения трех регистров в том, что эффективно три неназванных локальные переменные:

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

в общем, код в вашем вопросе недостаточно, чтобы сделать вывод, каким образом стек растет.

К счастью, мы знаем, такого рода вещи априори или может вычислить его, используя другой код: What is the direction of stack growth in most modern systems?

Смежные вопросы