![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?c9bd177)
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];
}
でヌルポインタの指す値を参照していますので、
ヤバいことには変わりありません。
No.5
- 回答日時:
ポインタ変数の概念を理解できていない人の典型だと思われます。
回答は他の人がやってるのでアドバイスだけ。
おそらく
int a;
と
int *a;
でどのようにメモリが確保されるかの違いが理解できていないのでは無いでしょうか?
私自身が昔そうでしたから。
int a;
とすると、「int型の整数を格納する為のメモリ」が確保されます。
int *a;
は「int型の整数を格納する為のメモリ」を参照する為の「アドレスを入れる為だけのメモリ」が確保されます。
重要なのは「int型の整数を格納する為のメモリ」そのものは確保されないということ。
まずこの概念が理解でき無いとダメです。
ポインタを理解するにはデバッカなどを使って実際にメモリの値を見ながらやると解かりやすいのですが、身近に詳しい人が居ないとなかなか難しいですね。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?c9bd177)
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;
}
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- 数学 単振り子とルンゲ・タック法 1 2022/07/15 00:05
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:07
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:13
- Excel(エクセル) excel2013 色付きセルの値合計 3 2023/02/28 11:48
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
戻り値で構造体を返すことは可...
-
Run-Time Check Failure #3とい...
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
ExcelVBAでのkernel32(64bit)
-
エラーの意味
-
LPSTR型の初期化について
-
Cで作成したDLL関数をVBから呼...
-
init関数の意味
-
C++ Builderでのnewコマンドに...
-
Vector定義の配列の共有メモリ化
-
VB6でのgethostbyaddrの使用方...
-
printfとscanfの違いって・・・
-
配列アドレスの減算
-
アプリを32bitから64bit移行
-
構造体とfscanf
-
ポインタのミスでOS壊れるの...
-
構造体の中の構造体
-
^と*の違いについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
init関数の意味
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
Run-Time Check Failure #3とい...
-
C言語の関数と配列に関する質問
-
LPSTR型の初期化について
-
戻り値で構造体を返すことは可...
-
参照型で受け取った引数をポイ...
-
構造体とfscanf
-
ExcelVBAでのkernel32(64bit)
-
アプリを32bitから64bit移行
-
Cで作成したDLL関数をVBから呼...
-
C言語でのconstを返す関数
-
main(int argc,char **argv[])...
-
DLL<->VB間での受け渡し(文字...
-
エラーの意味
-
PASCALとFARの意味
-
ハンドルはポインタか
-
CWnd::EnableWindow()の扱い方
おすすめ情報