C言語 ポインタについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sys

C言語 ポインタについて

#1

投稿記事 by sys » 14年前

ポインタについて勉強しているのですが、&アドレス演算子について
自分では解決出来ない問題点があるのでどなたかご教示下さい。

codeタグを追加させてただ来ました。 by softya(ソフト屋)

コード:

void FancArrayToPt(char *f_pt) {
  printf("f_pt [%p]\n", f_pt);
  printf("&f_pt [%p]\n", &f_pt);
}

void FancArrayToPt2(char *f_pt2) {
  printf("f_pt2 [%p]\n", f_pt2);
  printf("&f_pt2 [%p]\n", &f_pt2);
}

int main(int argc, char *argv[]) {
  char array[5] = "abcd";
  char array2[5] = "efgh";
  FancArrayToPt(array);
  FancArrayToPt2(array2);
  return 0;
}
実行結果
f_pt [0x7fff5fbff780]
&f_pt [0x7fff5fbff728]
f_pt2 [0x7fff5fbff770]
&f_pt2 [0x7fff5fbff728]

環境 Xcode 3.2.5 64bit

なぜ&f_ptと&f_pt2が同じアドレスを指しているのでしょうか?
よろしくお願い致します。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C言語 ポインタについて

#2

投稿記事 by softya(ソフト屋) » 14年前

この値が出たのは、コンパイラ、OS、CPUに依存する話だとまず断っておきます。
C言語の規格では保証されません。

たぶんコンパイラはgccだと思いますが、ローカル変数や引数はメモリ上のスタックと言う領域に確保されます。
これは動的に確保されるのて、関数呼び出し時に確保され関数から戻る時に解放されます。
&f_ptと&f_pt2も引数変数のアドレスですね。
FancArrayToPtを呼び出しすときも FancArrayToPt2も同じアドレスから始まるので引数が偶然同じアドレスとなったと言うことです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sys

Re: C言語 ポインタについて

#3

投稿記事 by sys » 14年前

codeタグへの変更ありがとうございます。

なるほど!
確認なのですが、では流れとしては、
void FancArrayToPt(char *f_pt) が呼ばれて、スタック上の 0x7fff5fbff728 に char *f_pt を確保。
void FancArrayToPt(char *f_pt) を抜けて、スタック上の 0x7fff5fbff728 を開放。
void FancArrayToPt2(char *f_pt2) が呼ばれて、スタック上の 0x7fff5fbff728 にchar *f_pt2 を確保。
void FancArrayToPt2(char *f_pt2) を抜けて、スタック上の 0x7fff5fbff728 を開放。
という流れで、たまたま同じアドレスだったということでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C言語 ポインタについて

#4

投稿記事 by softya(ソフト屋) » 14年前

そういう事になります。
FancArrayToPtなどを別の関数経由で呼べば、別のアドレスになりますよ。試してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sys

Re: C言語 ポインタについて

#5

投稿記事 by sys » 14年前

FancArrayToPt2からFancArrayToPtを呼んだら、違うアドレスになることを確認できました。

動作確認の為に、簡単なコードで確認してたら予想外の動作で困惑していました。
こういうこともあるのですね。非常に勉強になりました。
ご回答ありがとうございました。

sys

Re: C言語 ポインタについて

#6

投稿記事 by sys » 14年前

解決のチェック忘れていました。失礼しました。

閉鎖

“C言語何でも質問掲示板” へ戻る