アプリ版:「スタンプのみでお礼する」機能のリリースについて

次のようなプログラムはどこがおかしいでしょうか。

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にならないのでしょうか。

A 回答 (5件)

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];
}
でヌルポインタの指す値を参照していますので、
ヤバいことには変わりありません。
    • good
    • 0

ポインタ変数の概念を理解できていない人の典型だと思われます。


回答は他の人がやってるのでアドバイスだけ。

おそらく
int a;

int *a;
でどのようにメモリが確保されるかの違いが理解できていないのでは無いでしょうか?
私自身が昔そうでしたから。

int a;
とすると、「int型の整数を格納する為のメモリ」が確保されます。

int *a;
は「int型の整数を格納する為のメモリ」を参照する為の「アドレスを入れる為だけのメモリ」が確保されます。
重要なのは「int型の整数を格納する為のメモリ」そのものは確保されないということ。

まずこの概念が理解でき無いとダメです。

ポインタを理解するにはデバッカなどを使って実際にメモリの値を見ながらやると解かりやすいのですが、身近に詳しい人が居ないとなかなか難しいですね。
    • good
    • 0

こんにちは



エイリアスの質問ですか?
私だったらこう書く。

#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;
}
    • good
    • 0

 


 こういうことが、したいのかな?
#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;
}
 
    • good
    • 0

> q[1]=5,q[3]=6


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

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