理論で学んだメモリレイアウトが実際にアドレスとして出力すると期待通りにならない


後述のコードを実行すると、以下のような結果になりました。

私は基本的なメモリレイアウトとしてはmain関数やfunc関数を下記のように宣言してアドレスを出力した場合、stack領域に配置されるため、変数xと近いアドレスが出力結果として得られると予想しましたが、結果としてはグローバル変数として宣言し、bssセグメントに配置されるであろう変数jと限りなく近いアドレスにそれらは配置されることになることがわかりました。  
メモリレイアウトは環境によって異なることは承知しているのですが、自作関数がstack領域でないメモリに配置されることは可能性としてあるのでしょうか。

**実行結果:**

[code]

    0x1001a3edc
    0x1001a3ee0
    0x1001a8000
    0x16fc5f4dc
    0x6000000b0030
    
[/code]

**対象のコード:**

[code]

    #include <stdio.h>
    #include <stdlib.h>
    
    void func() {
        ;
    }
    
    int j;
    
    int main() {
        int x = 1;
        printf("%p\n", func);
        printf("%p\n", main);
        printf("%p\n", &j);
        printf("%p\n", &x);
        void *ptr = malloc(1);
        printf("%p\n", ptr);
    }
    
[/code]




現代的な実行環境では通常はメモリはその用途ごとに属性をつけて管理され、実行可能なコード (C 的に言えば関数) は独立したセクションに配置されます。
逆に言えば他のセクションは実行できないように管理されています。

関数がスタックに配置されるということは普通はないです。
メモリの分離があまりされていない素朴な実行環境では結果的にかぶることもあるかもしれませんが、関数を意図的にスタックに配置することは古い環境でもまずないです。
そういう資料を読んだのだとしたらそれは誤った記述 (もしくは質問者の誤解) です。

例えば私の環境での実行結果はこうです。

[code]

    00007ff6b1fe1450
    00007ff6b1fe1457
    00007ff6b1fed030
    0000001a5f1ffab4
    0000020ecb2b1400
    
[/code]

メモリ配置はこうです。

[![メモリ配置](https://i.stack.imgur.com/avRo1.png)](https://i.stack.imgur.com/avRo1.png)

実行可能コードが配置される `text` セクションと未初期化のデータが配置される `bss`
セクションはそれほどはなれていないませんので結果的に質問者の事例と似た感じですね。

スタックやヒープは後から伸ばしたりすることもあるので離れた位置に配置されています。




現代的な実行環境では通常はメモリはその用途ごとに属性をつけて管理され、実行可能なコード (C 的に言えば関数) は独立したセクションに配置されます。
逆に言えば他のセクションは実行できないように管理されています。

関数がスタックに配置されるということは普通はないです。
メモリの分離があまりされていない素朴な実行環境では結果的にかぶることもあるかもしれませんが、関数を意図的にスタックに配置することは古い環境でもまずないです。
そういう資料を読んだのだとしたらそれは誤った記述 (もしくは質問者の誤解) です。

例えば私の環境での実行結果はこうです。

[code]

    00007ff6b1fe1450
    00007ff6b1fe1457
    00007ff6b1fed030
    0000001a5f1ffab4
    0000020ecb2b1400
    
[/code]

メモリ配置はこうです。

[![メモリ配置](https://i.stack.imgur.com/avRo1.png)](https://i.stack.imgur.com/avRo1.png)

実行可能コードが配置される `text` セクションと未初期化のデータが配置される `bss`
セクションはそれほどはなれていないませんので結果的に質問者の事例と似た感じですね。

スタックやヒープは後から伸ばしたりすることもあるので離れた位置に配置されています。

