整数変数 m と整数データ型 n へのポインターを宣言しようとしています。
int m,*n;
*n=2;
printf("%d",*n);
上記のコードは正常に動作します。しかし
int *n,m;
*n=2;
printf("%d",*n);
セグメンテーション違反を引き起こします。
理由を説明してください。
整数変数 m と整数データ型 n へのポインターを宣言しようとしています。
int m,*n;
*n=2;
printf("%d",*n);
上記のコードは正常に動作します。しかし
int *n,m;
*n=2;
printf("%d",*n);
セグメンテーション違反を引き起こします。
理由を説明してください。
どちらのバージョンも間違っています。うまくいったバージョンで運が良かっただけです。ポインターを宣言しましたが、そのポインターにストレージを割り当てていません。これを試して:
int *n,m;
n=&m;
*n=2;
printf("%d",*n);
または使用malloc()
:
int *n;
n=malloc(sizeof(int));
*n=2;
printf("%d",*n);
free(n);
初期化されていないポインターを逆参照するため、どちらのコード セグメントもundefined behaviorを呼び出します。UB があると、鼻の悪魔が鼻から飛び出したり、プログラムがピザを注文したり、クラッシュしたり、動作したりします...最初にメモリを割り当てる必要があります。
int* n = malloc(sizeof(int));
*n = 2;
free(n);
または、別のオブジェクトのアドレスに設定します;;
int *n, m;
n = &m;
*n = 2;
ポインタ変数を宣言すると、メモリ内にスペースのブロックが割り当てられます。このスペースには、このプログラムの前に使用されていたものの残りのデータが既に含まれています。ポインタ内のデータがハード ドライブ上の領域外のメモリ位置を参照するため、セグメンテーション違反が発生します。アーメンが言ったように、どこを指すかを指示してポインターを初期化する必要があります。これにより、現在ポインターにあるデータが変数 m のアドレス (またはポインターが指す場所) に置き換えられます。
n は初期化されていないポインターです。アクセスするとエラーになります。
あなたはラッキーです最初のものはまったく機能します。どちらも初期化されていないポインターにアクセスしています。
"n" は何を指していますか? 初期化されていないため、何も指していません。いずれの場合も、n が値 2 を指しているものを代入しています。最初のものは最終的に厄介なバグにつながります。2 つ目はすぐにクラッシュしたのでラッキーです。
malloc を使用して n が指すメモリを作成し、それを割り当てます。