ザビタン開発日記
2009 | 01
2008 | 01 | 02 | 06 | 12
2007 | 10 | 11 | 12
11月 03 (土曜日) 2007
16:13
ポインタ変数の生死やいかに!?
 
C言語って、ある関数内で宣言・使用された変数ってその関数が終了orReturnすると
死んでしまうよね?

void main(){
int A; ←(1) たとえばAは0x1000番地に作られたとする
int B; ←(2) たとえばBは0x2000番地に作られたとする
A = 100;

B = test(A); ←(3) コール。でもまだ変数Cは存在しない

←(7) もうCは存在しない。0x3000も空き家になった。
その後は誰かが勝手に使うだろう・・・
}

int test(int hikisuu){
int C; ←(4) コールされて実行された!ここで初めて変数Cが誕生する。
じゃ、たとえばCは0x3000番地に作られたとする

C = C + 100; ←(5) Cは生きている。0x3000番地は使われている。
return C; ←(6) Cの内容はBにコピーされた。そしてその後、Cは死亡・・・
すなわち0x3000番地は誰も使っていないということになる
}


・・・これ、ポインタの場合ってどうなんだろう?? たとえば・・・

int main(){
int A; ←(1) 変数Aが作られた。じゃ、0x1000番地に作られたとする
int *B; ←(2) 「この時点」では、どこか占有されてるの?それとも??

B = 0x2000; ←(3) 「この時点」で初めて、変数*Bが誕生し、使ってる場所は0x2000になる
}

うーん。この(2)の時点がよくわからんなぁ・・・

もっと言うと、

------- A ----------- ------- B -----------
int main(){ int main(){
int A; int A;
int *B; int *B;
int *C;
int *D;
int *E;
int *F;
int *G;

B = 0x2000; B = 0x2000;
}

このようにA,B二つのソースを作ったとする。Bの場合、宣言はしたが
使っていないポインタが5つもある。
・・・これはなんらかの差になるのかなぁ・・・それとも???
 
●uchan@Guest -- 11/03 19:01
ポインタも実は4バイトの変数なので、int *B; も int B; もスタック上に4バイトの領域が確保されます。
●uchan@Guest -- 11/03 19:02
それから(3)の記述は大間違いでは?
●uchan@Guest -- 11/03 19:04
連投すみませんです。(3)は2つありますが、下の方のことです。
●hideyosi -- 11/04 00:37
ありゃ! 見落としてた。うっちゃん。毎度アドバイス感謝です。うーむ。そうなのかぁ・・・。そうすると、(3)の段階でもスタックに一箇所確保されている?? たとえば親関数(main)でポインタを宣言。子関数で構造体を作って値を入れた。で、そのアドレスを戻り値にしたりした場合、子関数内で作った変数本体はどうなるんだろうってのがちょっと疑問で。・・・だめか!ここじゃちょっと長くかけないや。近い内にWikiのほうにより詳しく書いてみよう

30日を過ぎたBlogにはコメントできません。

Referer  (6)
(1) 2 3 4 5 6 7 8 9 10 » 

PopnupBlog V3 Denali created by Bluemoon inc.