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

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

ただいまの
回答率

90.34%

  • C++

    3787questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

coutする度にアドレスの値が変わる理由

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 283

waribashi

score 15

 質問

以下のソースコードを一回目と二回目の実行でアドレスの値が変わるのはどうしてでしょうか?

 該当のソースコード

#include <iostream>
using namespace std;

void main() {
    int a = 1;
    int b[5];
    cout << "aの値:" << a << "\naのアドレス:" << &a << endl;

    for (int i = 0; i < 5; i++) {
        b[i] = i + a;
        cout << "b[" << i << "]の値:" << b[i] << endl;
        cout << "b[" << i << "]のアドレス:" << &b[i] << endl;
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+5

OSに搭載されているASLRという機能によってスタック空間のアドレスが実行ごとに変わるからです

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/11 21:20

    ありがとうございます!!

    キャンセル

0

        cout << "b[" << i << "]のアドレス:" << &b[i] << endl;

これのはなしかな?
i の値が変わるのだから、アドレスも当然変わりますねー

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/11 16:42

    すみません,問題補足しました.
    一回目の実行と二回目の実行で,同じ値でもアドレスの値が違う理由です

    キャンセル

  • 2018/07/11 16:43

    実際の出力結果を提示してください

    キャンセル

  • 2018/07/11 21:20

    1回目
    aの値:1
    aのアドレス:00BDFCB0
    b[0]の値:1
    b[0]のアドレス:00BDFC94
    b[1]の値:2
    b[1]のアドレス:00BDFC98
    b[2]の値:3
    b[2]のアドレス:00BDFC9C
    b[3]の値:4
    b[3]のアドレス:00BDFCA0
    b[4]の値:5
    b[4]のアドレス:00BDFCA4


    2回目
    aの値:1
    aのアドレス:00B9FCB4
    b[0]の値:1
    b[0]のアドレス:00B9FC98
    b[1]の値:2
    b[1]のアドレス:00B9FC9C
    b[2]の値:3
    b[2]のアドレス:00B9FCA0
    b[3]の値:4
    b[3]のアドレス:00B9FCA4
    b[4]の値:5
    b[4]のアドレス:00B9FCA8

    です

    キャンセル

  • 2018/07/11 21:26

    ローカル変数はスタック上に確保されるので、そのアドレスはスタックのエリアのアドレスです
    プログラムの初期化ルーチンやら割り込み周りの動作の違いでアドレスは変わる可能性はあるけど、
    (下位のFCB0がFCB4なのはこのせいじゃね?)
    まあ、こんだけ変わってるなら、別回答にあるASLRのせいってことになりそうですねー
    しかし、こんなことでASLRの動作がわかるというのはおもしろいなー

    キャンセル

0

配列(質問のコードでは、int b[5] )は、データの並びで、indexで並びの中の位置を指定することができます。

質問のコードの以下の部分は、forループになっていて、「cout << "b[" << i << "]のアドレス:" << &b[i] << endl;」で表示される &b[i]は、&b[0]、&b[1]、&b[2]、&b[3]、&b[4]と変わっていきますから、当然その位置(アドレス)も変わります。

    for (int i = 0; i < 5; i++) {
        b[i] = i + a;
        cout << "b[" << i << "]の値:" << b[i] << endl;
        cout << "b[" << i << "]のアドレス:" << &b[i] << endl;
    }

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • C++

    3787questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。