質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • C

    3700questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C言語で書かれたPC上のアドレス番号を確認するコードの理解について

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 214

tenjin

score 214

 前提・実現したいこと

C言語で書かれたPC上のアドレス番号を確認するコードが理解できずに困っています。
以下のソースコードをコンパイルし、実行したところ、エラーなどは表示されませんでした。
しかし、元のコードが何を要求して、何が返されているのかわからないため、
教えていただけますと幸いです。

 該当のソースコード

#include <stdio.h>
#include <stdlib.h>

int globalA = 317;

void indent(int d)
{
    for ( ; d ; d-- )
        printf("  ");
}

void f(int localA, int originalDepth)
{
    if (localA) {
        indent(originalDepth - localA); printf("Inside function f()\n");
        indent(originalDepth - localA); printf("local A: %d pointer to local A: %p\n",localA,&localA);
        f(localA-1, originalDepth);
        indent(originalDepth - localA); printf("exiting f()\n");
    }
}

int main(int argc, char **argv)
{
    printf("Pointer to function main(): %p\n", main);
    printf("global A: %d pointer to global A: %p\n",globalA,&globalA);
    printf("Pointer to function f(): %p\n", f);
    printf("Pointer to function printf(): %p\n", printf);
    f(10,10);
    exit(0);
}

実行結果(アドレス番号は変更してあります)

./a.out
Pointer to function main(): 0x1080faaaa
global A: 317 pointer to global A: 0x1080faaaa
Pointer to function f(): 0x1080aaaaa
Pointer to function printf(): 0x7fff6d8faaaa
Inside function f()
local A: 10 pointer to local A: 0x7ffee7baaaa
  Inside function f()
  local A: 9 pointer to local A: 0x7ffee7baaab
    Inside function f()
    local A: 8 pointer to local A: 0x7ffee7baaac
      Inside function f()
      local A: 7 pointer to local A: 0x7ffee7baaad
        Inside function f()
        local A: 6 pointer to local A: 0x7ffee7baaae
          Inside function f()
          local A: 5 pointer to local A: 0x7ffee7baaaf
            Inside function f()
            local A: 4 pointer to local A: 0x7ffee7baaa1
              Inside function f()
              local A: 3 pointer to local A: 0x7ffee7baaa2
                Inside function f()
                local A: 2 pointer to local A: 0x7ffee7baaa3
                  Inside function f()
                  local A: 1 pointer to local A: 0x7ffee7baaa4
                  exiting f()
                exiting f()
              exiting f()
            exiting f()
          exiting f()
        exiting f()
      exiting f()
    exiting f()
  exiting f()
exiting f()

 補足情報(FW/ツールのバージョンなど)

MacOS High Sierra
ターミナル バージョン2.8.2

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+3

このコードは外部から呼び出されて何かを返す類のコードではありません。
引数として何かを渡す必要もありません。

恐らく再帰関数を使った場合に、
スタック領域がどのように使用されるか勉強するためのコードだと思われます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+1

コード上にコメントを入れてみました。
おそらく注目すべきはf関数を再帰呼び出ししているので、そこに渡される引数の値とアドレス値がどのように移り変わっていくのかを見たいのではないかと思われます。

void f(int localA, int originalDepth)
{
    if (localA) {
        indent(originalDepth - localA); printf("Inside function f()\n");
        // 引数localAの値とメモリ上のアドレス値
        indent(originalDepth - localA); printf("local A: %d pointer to local A: %p\n",localA,&localA);
        f(localA-1, originalDepth);
        indent(originalDepth - localA); printf("exiting f()\n");
    }
}

int main(int argc, char **argv)
{
    // main関数が配置されているメモリ上のアドレス値
    printf("Pointer to function main(): %p\n", main);
    // グローバル変数globalAの値とメモリ上のアドレス値
    printf("global A: %d pointer to global A: %p\n",globalA,&globalA);
    // 関数fが配置されているメモリ上のアドレス値
    printf("Pointer to function f(): %p\n", f);
    // 関数printfが配置されているメモリ上のアドレス値
    printf("Pointer to function printf(): %p\n", printf);
    f(10,10);
    exit(0);
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3700questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。