0

私によると、次のコードは正常に実行されるはずですが、実行時に失敗します.理由がわかりません:

 void main()
 {
   int arr[5][3]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
   int *m=arr[0];
   int **p=&m;
   p=p+1;
   printf("%d",**p);

  }

a.exe は、gcc コンパイラ、Windows 7 64 ビットで実行時に動作を停止しました

4

4 に答える 4

4

ラインと

int **p=&m

整数へのポインターへのポインターを作成します。

次に、アドレスに 1 を追加します。つまり、次の整数を指すバイト数の 1 倍ではなく、1 つのメモリ アドレスです。

次に、それを 2 回参照します。

  • どちらの逆参照も未指定の値を返すため、2 番目の逆参照は、使用している OS のメモリ境界を壊す可能性があります。
  • どちらの場合も、境界合わせから外れるため、一部の OS で問題が発生する可能性があります。
于 2013-07-23T11:17:16.593 に答える
0

ここint **p=&m;に。pを指しmます。次に、 p が(integer)p = p + 1;の次のアドレスを指す場合。mそのアドレスにアクセスできない可能性があります。

于 2013-07-23T11:17:51.810 に答える