こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ポインタについて

C言語を勉強しております。
ポインタについてどうしても分からない箇所があり、
質問させて頂きます。

例えば、以下の様なプログラムがあったとします。
#include <stdio.h>
int hoge(int *);
int main(){
int i;
hoge(&i);
printf("%d\n",i);
exit(0);
}
int hoge(int *p_pi){
*p_pi = 10;
}
上記のプログラムは標準出力に"10"と表示するだけのプログラムですが、
これを
#include <stdio.h>
int hoge(int *);
int main(){
int *pi;
hoge(pi);
printf("%d\n",*pi);
exit(0);
}
int hoge(int *p_pi){
*p_pi = 10;
}
と書くとhogeの「*p_pi = 10;」の箇所でセグメンテーションエラーが発生します。
&iで渡した時とpiで渡した時ではどの様な違いがあり、エラーが発生するのでしょうか。

私の認識では、
&iで渡す時はアドレスを渡し、
piで渡す時もアドレスを渡すため、同じ動作になると考えています。

どうかご教示ください。
情報に不足があれば、仰ってください。
よろしくお願いします。

投稿日時 - 2008-06-28 04:56:37

QNo.4134848

困ってます

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

piに具体的な値(アドレス)が入って無いから。
それ以上でもそれ以下でもない。
前者のiの場合は最初から実態なので中身が不定でもアドレスが正しく存在するので問題ないっていうカラクリで
後者はアドレス自体が不定のままhogeに渡される。

投稿日時 - 2008-06-28 05:05:35

お礼

ご回答ありがとうございます。
なるほど。考え付きませんでした。
初期化(?)をしっかりやらないとダメってことですね。

int *piを宣言しただけでは、
piとしてのメモリだけ確保されて、
piの参照先のメモリは確保されてない(事が多い)んですね。

偶然どこか正当なメモリを参照してたら怖いですね・・・。

勉強になりました。
ありがとうございます。

投稿日時 - 2008-06-28 05:53:27

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問