最近、C言語を学習し始めた者です。
以下のソースコードを実行したところ、エラーが発生しました。
エラーの原因が知りたいです。基礎的な質問だと思いますがよろしくお願いします。
###該当のソースコード
C言語
1#include <stdio.h> 2 3void func(int *p,int i); 4 5int main(void){ 6 int *p,i; 7 func(p,i); 8 printf("%d\n",*p); 9 return 0; 10} 11 12void func(int *p,int i){ 13 i=100; 14 p=&i; 15 return; 16}
###発生している問題・エラーメッセージ
Segmentation fault (コアダンプ)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答5件
0
ベストアンサー
C言語では、引数はすべて値渡しです(構造体引数すら、コピーして値渡しという挙動になります)。つまり、func
の中で代入した変数は、main
の中の変数とは別なので、呼び出したmain
の側に影響することはありません。
そして、main
内でのint *p
は初期化されないままなので、それを逆参照した結果は「未定義」です。つまり、「コンパイルに失敗する」「何事もなかったかのようにどこかわからない場所を参照する」「コアダンプする」「システムごとクラッシュする」など、何が起きるともしれないプログラム、ということです。
関数から外側に値を伝える方法は3つあります。
- 返り値を返す
- 外部変数(グローバル or ファイル単位の
static
)を書き換える - ポインタで受け取って、そのポインタ経由で書き込む(ポインタ自体を書き換えたいなら、
int **
のようにダブルポインタとする必要があります)
投稿2016/05/26 01:55
総合スコア146544
0
エラーとしては、他の回答者の通り、main関数内のp
の値が初期化されていないことが原因です。
C
1void func(int *p,int i){ 2 i=100; 3 p=&i; 4 return; 5}
について、
p=&i;
にて、関数func内の変数p
に変数i
のアドレスを代入していますが、main関数の変数p
はそのアドレスを指しません。
(main関数のp
と関数funcのp
は別の変数であるため。)
2. 変数p
はmain関数で初期化されていないので、printf("%d\n",*p);
で参照した時に妥当なアドレスを見ていません。(ここでエラー)
printf("%d\n",*p);
で関数funcに与えた変数i
の値を表示したいならば、
- main関数内で
p
が妥当な領域を指せるようにする(p=&i
をfunc内ではなくてmain関数に書くなど) - 関数func内で
p
に値を代入する(p = &i
)のではなく、p
が指す領域に値が入るよう(*p = i
)にする
と良いと思います。
投稿2016/05/26 01:46
編集2016/05/26 05:17総合スコア144
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/26 02:22 編集
2016/05/26 02:18 編集

0
main の printf で参照している *p が未初期化(アドレス未定義)な状態だからだと思います。
p を func で設定しているつもりかと思われますがこれでは main の p にアドレスは設定されていません。
投稿2016/05/26 01:41
総合スコア2160
0
いくつかの回答で網羅されていますが、2つの誤解が組み合わさっているように思います(実引数のアドレスを返せるという誤解+値渡しに関する誤解)。
おそらくやりたいことを実現するには以下のようにする必要があります。
#include <stdio.h> void func(int **p, int *i); int main(void){ int *p,i; func(&p, &i); printf("%d\n", *p); return 0; } void func(int **p, int *i){ *i = 100; *p = i; }
それと、コンパイラには警告という機能があるので、基本これをONにして使うよいです。例えばgccでは普通は-Wall
オプションを使います。すると以下のように怪しい箇所を警告してくれます。
ファイル名:行: warning: ‘p’ is used uninitialized in this function [-Wuninitialized] ファイル名:行: warning: ‘i’ is used uninitialized in this function [-Wuninitialized]
投稿2016/05/26 02:00
総合スコア1151
0
int *p はポインタです。
使用する前にアドレスを設定する必要があります。
例えば、int a という変数を作成し、p = &a; とします。
C
1int main(void){ 2 int *p,i,a; 3 p = &a; 4 func(p,i); 5 printf("%d\n",*p); 6 return 0; 7}
これでpはaを参照することになります。
つまり、
printf("%d\n",*p);
と
printf("%d\n",a);
は同じ値になります。
投稿2016/05/26 01:45
総合スコア17000
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/26 01:57