次の C コードは、「セグメンテーション違反」エラーを返します。値 20 が返されない理由がわかりません。私のエラーは何ですか?
#include <stdio.h>
int main()
{
int* n;
*n = 20;
printf("%i\n",*n);
return 0;
}
次の C コードは、「セグメンテーション違反」エラーを返します。値 20 が返されない理由がわかりません。私のエラーは何ですか?
#include <stdio.h>
int main()
{
int* n;
*n = 20;
printf("%i\n",*n);
return 0;
}
にメモリを割り当てていないn
ので、
*n = 20;
不特定のメモリへの書き込みを試みます。
試す
#include <stdlib.h>
int *n = malloc(sizeof *n);
/* use n */
free(n);
にスペースを割り当てていません。 へのポインタをint
宣言しただけです。int
ポインタは初期化されていないため、メモリ内の不明な領域への書き込みは未定義の動作であり、問題が発生します。これは通常、セグメンテーション違反を引き起こします。
次を使用して、整数にスロットを割り当てることができますmalloc
。
n = malloc(sizeof(int));
対応する呼び出しを使用しfree
て、後でメモリを解放します。
free(n);
しかし、整数に単一のスロットを割り当てることは非常に珍しいことであり、通常int
はスタックに割り当てます。
int n;
n = 20;
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