7

次の C コードは、「セグメンテーション違反」エラーを返します。値 20 が返されない理由がわかりません。私のエラーは何ですか?

#include <stdio.h>

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

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

    return 0;

}
4

3 に答える 3

16

にメモリを割り当てていないnので、

*n = 20;

不特定のメモリへの書き込みを試みます。

試す

#include <stdlib.h>

int *n = malloc(sizeof *n);
/* use n */
free(n);
于 2012-06-30T22:17:20.400 に答える
5

にスペースを割り当てていません。 へのポインタint宣言しただけです。int

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

次を使用して、整数にスロットを割り当てることができますmalloc

n = malloc(sizeof(int));

対応する呼び出しを使用しfreeて、後でメモリを解放します。

free(n);

しかし、整数に単一のスロットを割り当てることは非常に珍しいことであり、通常intはスタックに割り当てます。

int n;
n = 20;
于 2012-06-30T22:17:17.460 に答える
2

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
于 2012-06-30T22:19:19.043 に答える