0

これは私のクイズの質問です(警告、長い):

次のプログラムを前提として、Sun SPARCアーキテクチャでコンパイルおよび実行した場合に、印刷される値が最小から最大にソートされるように、printf行を並べ替えます。これらの行は、printf()形式指定子%p(ポインター)を使用して、プログラムのさまざまな部分(割り当てられた値ではない)の16進アドレスを出力します。

#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

印刷されたメモリ値と競合する場合、理由はわかりませんが、誰かが理由を説明してもらえますか?ありがとう :) !

4

1 に答える 1