- ベストアンサー
C free関数の開放について。
独学でCを勉強し始めてる初心者です。 以下の構文で、最後に、 free(p); とあり、確保したメモリ「p」を開放していますが、 確保したメモリ「q」は開放しなくて良いのでしょうか? この場合は同じ部分のメモリを確保しているからqは開放しなくて良いということなんでしょうか…宜しくお願い致します。 #include <stdio.h> #include <stdlib.h> int main(void) { int *p; p=malloc(sizeof(int)*3); if(p==NULL) exit(1); p[0]=10; p[1]=20; p[2]=30; printf("%d\n",p[0]+p[1]+p[2]); free(p); return=0; }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
質問の答え: qは確保されたメモリではない。 (pが確保されたメモリを指すのであって、qはその値のコピー) p = アロケートしたメモリのアドレス q = pの値をコピーしたもの >q=p; >*q=100; >q++; >*q=200; >q++; >*q=300; >printf("%d,%d,%d\n",*p,*(p+1),*(p+2)); このプログラムの意図は、 ・変数pのコピーqを用いて、本来pが指していたアドレスに値を詰めること ・intへのポインタ(q)をインクリメントして、あたかもint配列に値を詰める操作 上の2点が可能であるということですね。
その他の回答 (1)
- okg00
- ベストアンサー率39% (1322/3338)
qを確保してませんけど...
補足
すみません…構文内容を間違えてしまいました… 上記のものは間違いで 質問したかった内容のものは以下のものです… include <stdio.h> #include <stdlib.h> int main(void) { int *p, *q; p=malloc(sizeof(int)*3); if(p==NULL) exit(1); q=p; *q=100; q++; *q=200; q++; *q=300; printf("%d,%d,%d\n",*p,*(p+1),*(p+2)); free(p); return=0; } 混乱招いてしまい申し訳ありません…。
補足
qは単にpのコピーなのですね! 分かり易い説明をいただきスッキリ解決いたしました…! ありがとうございました!