int main(){
int *p=0;
printf("%d",++p);
}
私のマシンでは、出力が 4 になっています。最初は、*p はアドレス 0 を指し、それをインクリメントすると 0 からアドレス 4 を指すと思っていました。
後者は *p = -1; と宣言しました。-1 はアドレスにすることはできませんが、「3」を出力するため、エラーをスローする必要があると思いました:(
ここで何が起こっているのか教えてください。前もって感謝します。
int *p=0
アドレス 0 でポインターを宣言します
。++p
そのポインターをホスト固有のsizeof int
. これは、システムでは 4 バイトです。
int *p=-1
は、アドレス付きのポインターを返します0xffffffff
(32 ビット ポインターを想定)
は、 which is++p
と同等です。これは 32 ビットの int をオーバーフローさせ、.0xffffffff + 4
0x100000003
0x00000003
未定義の動作。
あなたが言う時:
int* p = 0;
nullptr
null (またはC++11)へのポインターを宣言しています。次に、次のことを行います。
printf("%d", ++p);
ポインターの位置を出力していますが、間違ったフォーマット文字列を渡しています。これは未定義です。
あなたのアーキテクチャでは int はポインタと同じサイズであるため、たまたまうまくいきます。4
あなたのポインタに追加すると、アドレスが1
整数のサイズ、あなたの場合は4バイトだけ移動するからです。
Cの実装で負のポインタを許可するかどうかを決定するためのC標準を確認できます。ただし、-1は有効なアドレス値(32ビットでは0xffffffff)である可能性があり、それをインクリメントすると0xffffffff + 4=0x03になります。