2012-06-30 14 views
6

次のCコードは「セグメンテーションフォールト」エラーを返します。なぜそれが値20を返さないのかわかりません。私のエラーは何ですか?Cで値を出力しようとするとセグメンテーションフォルトが発生する

#include <stdio.h> 

int main() 
{ 
    int* n; 
    *n = 20; 

    printf("%i\n",*n); 

    return 0; 

} 
+0

'N' は初期化されていないポインタあなたがラインでデリファレンスしている値「* N = 20であります'ポインタを使用する場合は、逆参照しようとする前に、有効なメモリ位置を指すようにポインタを初期化する必要があります。 – reuben

+0

すでに与えられた答えに代わって、 'int n = 20'だけで、' n 'のアドレスを 'int *'を必要とする関数に渡すことができます。 – Vassilis

答えて

14

あなたは、nに指定されていないメモリを記述するので、

*n = 20; 

試みをメモリを割り当てられていません。

あなたはゴミ値で20を書こうとしている

#include <stdlib.h> 

int *n = malloc(sizeof *n); 
/* use n */ 
free(n); 
+1

完了したら、無料で忘れることはありません! –

+0

良い点、それ。 –

4

あなたのintのためのスペースが割り当てられていない、あなただけのintポインタを宣言しました。

ポインタが初期化されていないため、メモリ内のその未知の領域への書き込みは未定義の動作であり、問​​題が発生します。これにより、通常、セグメンテーションが発生します。

あなたはmallocを使用して整数ためのスロットを割り当てることができます。

n = malloc(sizeof(int)); 

以降のメモリを解放するfreeに対応するコールを使用します。

free(n); 

しかし、ANのための単一のスロットを割り当てます整数はかなり普通ではありません。通常は、スタックにintを割り当てます。

int n; 
n = 20; 
1

を試してみてください。 *alloc()関数の1つを使用するか、スタックにintを作成してそれを取得するためにスペースを割り当てる必要があります(Richard J. Ross IIIがコメントで述べたように)。

ダイナミックアロケーション:

int n*; 
n = malloc(sizeof(int)); /* allocate space for an int */ 
if(n != NULL) { 
/* do something.. */ 
free(n); /* free 'n' */ 
} else { 
    /*No space available. */ 
} 

またはスタック上:

int int_on_stack; 
int *n = &int_on_stack; 
*n = 20; 
printf("%i\n", *n); // 20 
+1

'malloc'は唯一の解決策ではないことに注意してください。 'mmap'、' alloca'があり、単純にスタックにintを作り、アドレスを取得するだけです。 –

+0

@ RichardJ.RossIII:ありがとう。更新しました。 – Jack

+0

あなたのスタックの例は、 "それをアンドレスにする"と一貫していません。あなたが望むのは 'intstackです。 int n =&onstack; * n = 20; printf( "%i \ n"、* n); '...特権を編集したので、先に進んで変更を加えました。 –

関連する問題