• ベストアンサー

ポインタ変数の利用方法

次のようなプログラムはどこがおかしいでしょうか。 double *p[5]; /*double型へのポインタ変数を5個用意*/ double q[5]; double a, b; for(i=0;i<5;i++){ *p[i]=0; /*ポインタp[i]の指す値を初期化*/ } p[1]=&a;  p[3]=&b; a=5; b=6; for(i=0;i<5;i++){ q[i]=*p[i]; } これで、q[1]=5,q[3]=6にならないのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • phusike
  • ベストアンサー率38% (29/76)
回答No.2

for(i=0;i<5;i++){ *p[i]=0; /*ポインタp[i]の指す値を初期化*/ } ここが極めてヤバい。 このforループを実行する直前の時点では、 p[i]にはよく訳の分からない謎のアドレスが入っているわけです。 *p[i]とはそのアドレスの指す中身ですから、 訳の分からないアドレスに入っている対象を、 勝手に中身を0に初期化しているわけです。 ポインタをヌルポインタに初期化したいのなら、 p[i]=0; ですね。 ただし、その場合でも最後の for(i=0;i<5;i++){ q[i]=*p[i]; } でヌルポインタの指す値を参照していますので、 ヤバいことには変わりありません。

その他の回答 (4)

noname#66257
noname#66257
回答No.5

ポインタ変数の概念を理解できていない人の典型だと思われます。 回答は他の人がやってるのでアドバイスだけ。 おそらく int a; と int *a; でどのようにメモリが確保されるかの違いが理解できていないのでは無いでしょうか? 私自身が昔そうでしたから。 int a; とすると、「int型の整数を格納する為のメモリ」が確保されます。 int *a; は「int型の整数を格納する為のメモリ」を参照する為の「アドレスを入れる為だけのメモリ」が確保されます。 重要なのは「int型の整数を格納する為のメモリ」そのものは確保されないということ。 まずこの概念が理解でき無いとダメです。 ポインタを理解するにはデバッカなどを使って実際にメモリの値を見ながらやると解かりやすいのですが、身近に詳しい人が居ないとなかなか難しいですね。

noname#123613
noname#123613
回答No.4

こんにちは エイリアスの質問ですか? 私だったらこう書く。 #include <stdio.h> int main(void){   double *p;   double q[5], a, b;   int i;   a = 5;   b = 6;   for(i = 0; i < 5; i++){     if(i==1) q[i]=a;     else if(i==3) q[i]=b;     else q[i]=0;   }   p=q;   for(i = 0; i < 5; i++)     printf("%lf ", p[i]);     // p[i]は*(p+i)かq[i]か*(q+i)でも良い。   return 0; }

回答No.3

   こういうことが、したいのかな? #include <stdio.h> int main(void) { int *p[5]; int q[5], a, b, i; for(i = 0; i < 5; i ++) q[i] = i; for(i = 0; i < 5; i ++) p[i] = &q[i]; for(i = 0; i < 5; i ++) printf("%d ", *p[i]); putchar('\n'); a = 5; b = 6; p[1] = &a; p[3] = &b; for(i = 0; i < 5; i ++) printf("%d ", *p[i]); return 0; }  

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

> q[1]=5,q[3]=6 になりますが、 > *p[i]=0; p[i]の指し示すところに0を代入しようとしてます。 このときのp[i]は、初期化されてないので、メモリ破壊を起こす可能性が高いです。 また運よくp[]が0クリアされたとしても、 > q[i]=*p[i]; で、アドレス0にアクセスしようとして、メモリアクセス違反になるかと。 DOSなら、ならないかもしれませんが。

関連するQ&A