это мой вопрос викторины (предупреждение, длинный):
Учитывая следующую программу, измените порядок строк printf так, чтобы значения, которые выводятся на печать, сортировались из
от наименьшего к наибольшему, если он скомпилирован и работает на архитектуре Sun SPARC. Эти строки выводят шестнадцатеричный адрес
различные части программы (не назначенные значения) с указателем формата printf ()% p (указатель).
#include <stdio.h>
#include <stdlib.h>
int a = 420;
void foo() {
int b;
/* 1 */ printf( "b --> %p\n", &b );
}
int
main( int argc, char *argv[] ) {
int c;
int d = 42;
static int e;
/* 2 */ (void) printf( "foo() --> %p\n", foo );
/* 3 */ (void) printf( "e --> %p\n", &e );
/* 4 */ (void) printf( "malloc --> %p\n", malloc(420) );
foo();
/* 5 */ (void) printf( "d --> %p\n", &d );
/* 6 */ (void) printf( "argv --> %p\n", &argv );
/* 7 */ (void) printf( "a --> %p\n", &a );
/* 8 */ (void) printf( "c --> %p\n", &c );
/* 9 */ (void) printf( "argc --> %p\n", &argc );
return 0;
}
Я запустил эту программу на C и получил следующие напечатанные значения:
2 foo() --> 10594
3 e --> 2099c
4 malloc --> 209a8
1 b --> ffbff1b4
5 d --> ffbff228
6 argv --> ffbff288
7 a --> 20974
8 c --> ffbff22c
9 argc --> ffbff284
Мой вопрос хорошо .... почему? Я попытался сделать это вручную, вспомнив, где была сохранена каждая переменная (стек, BSS, данные и т. Д.), И попытался упорядочить их, сказав, что это порядок переменных, от малой памяти до большой памяти:
Так это должно быть организовано от наименьшего к наименьшему?
LOW MEMORY - text (labels, function names):
2 - foo
data (initialized global/static vars):
7 - a
BSS ( initialized global/static vars:
3 - e
stack (local vars):
9 - argc
6 - argv[]
8 - c
5 - d
1 - b
4 - ptr returned by malloc
HIGH MEMORY
Если это противоречит напечатанным значениям памяти, я не знаю почему, кто-то возражает объяснить, почему? Спасибо :)!