1

これは非常に単純なはずですが、コンパイラがここで不平を言っている理由がわかりません。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int *n = 5;

  printf ("n: %d", *n);

  exit(0);
}

次の苦情を取得します。

foo.c: 関数 'main' 内:
foo.c:6: 警告: 初期化により、キャストなしで整数からポインターが作成されます

ポインター n が参照する値を出力したいだけです。printf() ステートメントで逆参照すると、セグメンテーション違反が発生します。これを gcc -o foo foo.c でコンパイルします。

4

4 に答える 4

7

ポインタをメモリ address5に設定して、 address にあるものを指すようにします55おそらく、値が格納されているアドレスを指すようにしたかったでしょう。例えば:

int v = 5;    // Store the value 5 in a normal variable
int *n = &v;  // Make n contain the address of v, so that it points to the 
              // contents of v
于 2010-06-10T23:58:52.537 に答える
3

n を仮想メモリ アドレス 5 に設定しています。このメモリはアプリに対して有効ではないため、クラッシュが発生します。

必要なのは、最初に有効なメモリを取得することです。スタックを使用するか、ヒープを使用するかの 2 つのオプションがあります。

以下のようなことをすると、n をスタック変数に「ポイント」し、そこで値 5 を割り当てることができます

int stackVar = 0;
int *n = &stackVar;
*n = 5;

スタックとヒープの違いは、メモリがどこから来るかです。スタック変数は、関数呼び出しの間だけ存続します。関数が返されると、スタック変数が「ポップ」され、それらのメモリは無効になります。-- したがって、上記の例から、「n」は「stackVar」が存在する限り、この場合は関数から戻るポイントまでしか使用できません。

あなたが設定した場合

int *n = (int *)malloc(sizeof(int));
*n = 5;

sizeof(int) バイトの大きさの「ヒープ」変数を作成します。この変数は、「free」を呼び出すまで続きます

free(n);

「new」の呼び出しで追加の簿記メモリが作成されるため、これを行うと多少重いことに注意してください。それは多くはありませんが、そこにあるでしょう。通常、ヒープからより大きなクラス/構造体を割り当てます。ヒープを使用することのもう 1 つの負担は、忘れずに削除する必要があることです。そうしないと、「リーク」してしまいます。以前にこれらを見たことがあると思います:-)アプリを実行する時間が長くなるほど、より多くのメモリが使用されます

これは意味がありますか?:)

于 2010-06-10T23:59:01.803 に答える
2

ポインタの値を「5」に設定しているためです(メモリアドレス5のように)。

あなたはおそらく次のことを意味していました:

int *n = 新しい int(5);

int *n = malloc(sizeof(int));
*n = 5;

malloc()ポインタを設定したいメモリアドレスを返します。

于 2010-06-10T23:56:02.520 に答える
0

ポインタを値のアドレスに設定する必要があります...

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int value = 5; 
  int *n = &value;

  printf ("n: %d", *n);

  exit(0);
}
于 2010-06-11T00:00:37.197 に答える