1

整数変数 m と整数データ型 n へのポインターを宣言しようとしています。

int m,*n;
*n=2;
printf("%d",*n);

上記のコードは正常に動作します。しかし

int *n,m;
*n=2;
printf("%d",*n);

セグメンテーション違反を引き起こします。

理由を説明してください。

4

5 に答える 5

7

どちらのバージョンも間違っています。うまくいったバージョンで運が良かっただけです。ポインターを宣言しましたが、そのポインターにストレージを割り当てていません。これを試して:

int *n,m;
n=&m;
*n=2;
printf("%d",*n);

または使用malloc()

int *n;
n=malloc(sizeof(int));
*n=2;
printf("%d",*n);
free(n);
于 2011-06-15T18:56:19.340 に答える
4

初期化されていないポインターを逆参照するため、どちらのコード セグメントもundefined behaviorを呼び出します。UB があると、鼻の悪魔が鼻から飛び出したり、プログラムがピザを注文したり、クラッシュしたり、動作したりします...最初にメモリを割り当てる必要があります。

int* n = malloc(sizeof(int));
*n = 2;
free(n);

または、別のオブジェクトのアドレスに設定します;;

int *n, m;
n = &m;
*n = 2;
于 2011-06-15T18:55:43.657 に答える
1

ポインタ変数を宣言すると、メモリ内にスペースのブロックが割り当てられます。このスペースには、このプログラムの前に使用されていたものの残りのデータが既に含まれています。ポインタ内のデータがハード ドライブ上の領域外のメモリ位置を参照するため、セグメンテーション違反が発生します。アーメンが言ったように、どこを指すかを指示してポインターを初期化する必要があります。これにより、現在ポインターにあるデータが変数 m のアドレス (またはポインターが指す場所) に置き換えられます。

于 2011-06-15T19:04:49.053 に答える
0

n は初期化されていないポインターです。アクセスするとエラーになります。

于 2011-06-15T18:56:36.203 に答える
0

あなたはラッキーです最初のものはまったく機能します。どちらも初期化されていないポインターにアクセスしています。

"n" は何を指していますか? 初期化されていないため、何も指していません。いずれの場合も、n が値 2 を指しているものを代入しています。最初のものは最終的に厄介なバグにつながります。2 つ目はすぐにクラッシュしたのでラッキーです。

malloc を使用して n が指すメモリを作成し、それを割り当てます。

于 2011-06-15T18:58:02.860 に答える