1
int main(){
  int *p=0;
  printf("%d",++p);
}

私のマシンでは、出力が 4 になっています。最初は、*p はアドレス 0 を指し、それをインクリメントすると 0 からアドレス 4 を指すと思っていました。

後者は *p = -1; と宣言しました。-1 はアドレスにすることはできませんが、「3」を出力するため、エラーをスローする必要があると思いました:(

ここで何が起こっているのか教えてください。前もって感謝します。

4

3 に答える 3

11

int *p=0アドレス 0 でポインターを宣言します 。
++pそのポインターをホスト固有のsizeof int. これは、システムでは 4 バイトです。

int *p=-1は、アドレス付きのポインターを返します0xffffffff(32 ビット ポインターを想定) は、 which is
++pと同等です。これは 32 ビットの int をオーバーフローさせ、.0xffffffff + 40x1000000030x00000003

于 2012-11-21T14:05:28.323 に答える
4

未定義の動作。

あなたが言う時:

int* p = 0;

nullptrnull (またはC++11)へのポインターを宣言しています。次に、次のことを行います。

printf("%d", ++p);

ポインターの位置を出力していますが、間違ったフォーマット文字列を渡しています。これは未定義です。

あなたのアーキテクチャでは int はポインタと同じサイズであるため、たまたまうまくいきます。4あなたのポインタに追加すると、アドレスが1整数のサイズ、あなたの場合は4バイトだけ移動するからです。

于 2012-11-21T14:04:12.567 に答える
0

Cの実装で負のポインタを許可するかどうかを決定するためのC標準を確認できます。ただし、-1は有効なアドレス値(32ビットでは0xffffffff)である可能性があり、それをインクリメントすると0xffffffff + 4=0x03になります。

于 2012-11-21T14:08:29.640 に答える