次のCコードは「セグメンテーションフォールト」エラーを返します。なぜそれが値20を返さないのかわかりません。私のエラーは何ですか?Cで値を出力しようとするとセグメンテーションフォルトが発生する
#include <stdio.h>
int main()
{
int* n;
*n = 20;
printf("%i\n",*n);
return 0;
}
次のCコードは「セグメンテーションフォールト」エラーを返します。なぜそれが値20を返さないのかわかりません。私のエラーは何ですか?Cで値を出力しようとするとセグメンテーションフォルトが発生する
#include <stdio.h>
int main()
{
int* n;
*n = 20;
printf("%i\n",*n);
return 0;
}
あなたは、n
に指定されていないメモリを記述するので、
*n = 20;
試みをメモリを割り当てられていません。
あなたはゴミ値で20
を書こうとしている
#include <stdlib.h>
int *n = malloc(sizeof *n);
/* use n */
free(n);
完了したら、無料で忘れることはありません! –
良い点、それ。 –
あなたのint
のためのスペースが割り当てられていない、あなただけのint
にポインタを宣言しました。
ポインタが初期化されていないため、メモリ内のその未知の領域への書き込みは未定義の動作であり、問題が発生します。これにより、通常、セグメンテーションが発生します。
あなたはmalloc
を使用して整数ためのスロットを割り当てることができます。
n = malloc(sizeof(int));
以降のメモリを解放するfree
に対応するコールを使用します。
free(n);
しかし、ANのための単一のスロットを割り当てます整数はかなり普通ではありません。通常は、スタックにint
を割り当てます。
int n;
n = 20;
を試してみてください。 *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
'malloc'は唯一の解決策ではないことに注意してください。 'mmap'、' alloca'があり、単純にスタックにintを作り、アドレスを取得するだけです。 –
@ RichardJ.RossIII:ありがとう。更新しました。 – Jack
あなたのスタックの例は、 "それをアンドレスにする"と一貫していません。あなたが望むのは 'intstackです。 int n =&onstack; * n = 20; printf( "%i \ n"、* n); '...特権を編集したので、先に進んで変更を加えました。 –
'N' は初期化されていないポインタあなたがラインでデリファレンスしている値「* N = 20であります'ポインタを使用する場合は、逆参照しようとする前に、有効なメモリ位置を指すようにポインタを初期化する必要があります。 – reuben
すでに与えられた答えに代わって、 'int n = 20'だけで、' n 'のアドレスを 'int *'を必要とする関数に渡すことができます。 – Vassilis