2017-01-04 2 views
2

私はこのコード部分を実行した後にセグメンテーションフォールトを取得します。私が最初のprintfをコメントアウトすると、それはうまく動作します。なぜこれが起こりますか?あなたのmain関数の内部C printf関数を追加した後のセグメンテーションフォルト。

#include <stdio.h> 

int Func (int *a){ 
    printf("%d\n",56); 
    printf("a is %d\n",*a); 
    return 3; 
} 


int main(){ 
    int N, i, Planet, *a,junk; 

    junk=scanf("%d", &N); 
    *a = N; 
    Planet = Func(a); 
    printf("%d\n", Planet); 
    return 0 ; 
} 
+6

を1行に1つの変数を宣言するためにあなたを提案し、NULLへのポインタを初期化すると思います。 (あなたの '* a = N;'行)は未定義の振る舞いです – yano

+0

すべての警告を有効にしてコンパイルを試みましたか?その警告の1つがあなたのsegfaultの原因を示します。 – Evert

+0

もう少し明確にするために、基本的にはどこにも*触れていない 'int *'があります。 '* a = N;'を実行すると、コンピュータはその場所に移動し、その場所に 'N 'の内容を書き留めます。これがセグメンテーションの原因となっています。 – turbulencetoo

答えて

2

、あなたはint *aポインタ変数に定義:

int main(){ 
    int N, i, Planet, *a,junk; 

をしかし、その後、あなたは以前にそれのために任意のメモリを割り当てられないままポインタを間接参照、またポイントに設定します意味のあるものに:

*a = N; 

この結果、定義されていない動作になります。

aNを指していますか?

a = &N; 

今、あなたはNにいくつかのコンテンツを書くために*aを使用することができます。 もしそうなら、これは正しい構文です。


P.S.一般的なルールとして 、私は:例えば、あなたが `int型* A`ための任意の領域を割り当てるいない

int man() { 
    int *a = NULL; 
    ... 
+0

私はそれを持っていましたが、なぜ最初のprintfをコメントアウトした後に正しく動作しましたか? – user7375077

+0

@ user7375077:生成されたアセンブリを調べて、コンパイルされたコードが実際に何をしたのか、そして、その2つの場合の違いを調べることができます。初期化されていない 'a'の' * a = N'は_undefined behavior_です:すべてが起こります。 –

関連する問題