出産前後の痔にはご注意!

先程関数による動的確保について質問させていただき、ヒントを与えていただいたのですが、そこからまた疑問が生じました。

テストプログラムを作ったのですが、何やら動作がおかしいみたいです
おかしい部分を抜き出したソースは次のとおりです

int main()
{
 int **p;
 int i;

 p = (int **)malloc(sizeof(int *));
 *p = (int *)malloc(sizeof(int));

 p[0]=0;
 for(i=1;i<10;i++){
  *p = (int *)realloc(*p,sizeof(int)*(i+1));
  *p[i] = i;
 }
 free(*p);
 return 0;
}

関数部として作りたい部分をメインにして抜き出しました。

このようにするとreallocがメモリ領域を拡張してくれなく(?)、*p[i] = i;の部分でエラー終了します。
ポインタのポインタではなく、ポインタを用いた時は正常に動作するのですが、何がまずいのでしょうか。

もし宜しければお願いいたします。

ちなみに私は学部4年生で、プログラムの使用は大学の研究用レベルです。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

reallocで確保した領域へのアクセス方法が問題になっていると思います。



*p[i]だと、*(p[i])という風に解釈されてしまいます。
これでは、pという連続領域のi番目のアドレスを参照するということになります。

今回はpが指す先の連続領域を参照したいので、(*p)[i]という形にすべきかと。
演算子の優先順位を把握しておくことが大事になるので、注意しておくべき点ですね。

それと、好みの問題ですが、*(*p+i)という記述であれば、よりポインタのポインタと分かりやすいかも。
あと、freeするのであれば全ての領域に対して記述されてみては?
    • good
    • 0
この回答へのお礼

ありがとうございます。
綺麗に解決いたしました。
優先順位を復習したいと思います^^;

お礼日時:2007/06/19 19:54

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング