int *j;
を宣言した後に、int *
という種類のスペースが、いくつかのアドレスがaddr_stk
であり、私たちが知らないスタック(この場合)に割り当てられます。ごみ。
+--------+ +--------+
| ??? |----+ | xxx | trying to store 50 here
+--------+ | +--------+
| j | | | |
+--------+ | +--------+
|addr_stk| +---->| ??? | have no permission to access this location
+--------+ +--------+
もしポインタ変数(オブジェクト)j
の*j = 50;
内容を使用そこに値50
を格納するアドレスとして使用されます。したがって、値50をガベージ・アドレス値を持ついくつかのアドレス位置に格納しようとします。つまり、どこにでも置くことができます。あなたが割り当てられていないメモリの場所にアクセスしようとすると、その場所を保存またはアクセスできなくなるたびに、オペレーティングシステムはそれを止めて何らかのエラーを投げます。
まず、ポインタ変数j
を有効なアドレスで初期化します。これは、最初にいくつかのメモリをmalloc
に割り当ててから使用することによって行うことができます。他の変数(ローカルまたはグローバル)のアドレスでj
を初期化する。 *j
にアクセスするとき、我々はそのためのアドレス(ポインタアクセス)としてj
の内容を使用して、j
内部の有効なアドレスを持っている場合の両方で
int *j, i;
j = &i;
*j = 50;
または
int *j;
j = malloc (sizeof (int));
*j = 50;
のような、有効で、*j
解決時に有効なメモリアクセスに変換します。
重要なことは、malloc
でメモリを割り当てるときは、常にメモリを解放することです。これは良い習慣であり、そうでなければ大きなプログラムではメモリリークにつながります。
コード1は完全に有効ではありません。完全に定義されていない動作です。 'j'は初期化されていないポインタです。 –
まあ、私は何を意味するのはちょうどコンパイル時です –