ページ 11

C言語 ポインタについて

Posted: 2011年5月18日(水) 00:37
by sys
ポインタについて勉強しているのですが、&アドレス演算子について
自分では解決出来ない問題点があるのでどなたかご教示下さい。

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が同じアドレスを指しているのでしょうか?
よろしくお願い致します。

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

Posted: 2011年5月18日(水) 00:53
by softya(ソフト屋)
この値が出たのは、コンパイラ、OS、CPUに依存する話だとまず断っておきます。
C言語の規格では保証されません。

たぶんコンパイラはgccだと思いますが、ローカル変数や引数はメモリ上のスタックと言う領域に確保されます。
これは動的に確保されるのて、関数呼び出し時に確保され関数から戻る時に解放されます。
&f_ptと&f_pt2も引数変数のアドレスですね。
FancArrayToPtを呼び出しすときも FancArrayToPt2も同じアドレスから始まるので引数が偶然同じアドレスとなったと言うことです。

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

Posted: 2011年5月18日(水) 01:08
by sys
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 を開放。
という流れで、たまたま同じアドレスだったということでしょうか?

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

Posted: 2011年5月18日(水) 01:11
by softya(ソフト屋)
そういう事になります。
FancArrayToPtなどを別の関数経由で呼べば、別のアドレスになりますよ。試してみてください。

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

Posted: 2011年5月18日(水) 01:17
by sys
FancArrayToPt2からFancArrayToPtを呼んだら、違うアドレスになることを確認できました。

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

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

Posted: 2011年5月18日(水) 01:54
by sys
解決のチェック忘れていました。失礼しました。