-1

以下のコードでの私の目的は、メモリ アドレスが p++ によって実際に変更されていることを確認することでした (実際に変更されています)。 242? つまり、242 行を過ぎると、プログラムは何もせず、最後の行「それだけ」は実行されません。

ありがとう

#include <iostream>
using namespace std;

int main()
{
cout<<"start..."<<endl;
int x=100;
int *p = &x;

for (int i=0; i<300; i++)
{
    cout<<i<<". &p:="<<p<<" v:="<<*p<<endl;
    p++;
}

cout << "that's it!" << endl;
return 0;
}

結果:

start...
0. &p:=0x7fff59c30c34 v:=100
1. &p:=0x7fff59c30c38 v:=1706885214
2. &p:=0x7fff59c30c3c v:=32767
3. &p:=0x7fff59c30c40 v:=1505954904

. . .

240. &p:=0x7fff59c30ff4 v:=946024503
241. &p:=0x7fff59c30ff8 v:=892744247
242. &p:=0x7fff59c30ffc v:=13617
4

5 に答える 5

2
int x=100;
int *p = &x; //you allocated one int and you can point to it

for (int i=0; i<300; i++)
{
    cout<<i<<". &p:="<<p<<" v:="<<*p<<endl;
    p++;
//  ^^^
//  here you are pointing your pointer at next 4 bytes, but 
//  dereferencing it is an undefined behavior that you actually do observe
//  you don't know what is next address pointing to and you are not allowed
//  to dereference it
}

コメントで言ったように、これは未定義であり、100年はうまくいき、その後うまくいかなくなる可能性があります。

テストの解決策は次のとおりです。

int *p = new int[300]; //now you can point to any address within this table

for (int i=0; i<300; i++)
{
    cout<<i<<". &p:="<<p<<" v:="<<*p<<endl;
    p++;
}
于 2013-06-30T00:12:47.850 に答える
1

OS はメモリーページを 1k 、 4k 、8k など
のサイズのプロセスにマップします ポインター p はマップされた「ページ」にあるアドレスを指しています. ポインター p が指すアドレスがマップされたページを超えると, カーネルはあなたが無効なメモリを参照しているため、信号が発生します。

于 2013-06-30T00:24:14.897 に答える
1

コマンド内ではなく直接プログラムを実行する場合。すべてOKです(3000回ループしても)

次に、cmdコンソールで実行するとフリーズしました。

したがって、それはほとんどプログラムのようなものであり、cmdシェルがメモリを共有してフリーズを引き起こす可能性があると思います。

だから、それは本当にOSに依存しています。

于 2013-06-30T01:05:23.177 に答える
1

p++ を使用して、プログラムに割り当てられていない/割り当てられていないメモリにアクセスしようとしています。242 は、OS が試行を停止する任意の数字にすぎないと思います。それはまったく正しくなく、一貫性がありません。

于 2013-06-30T00:13:43.183 に答える
1

あなたのプログラムには、複数のアカウントで未定義の動作があります。

int x=100; int *p = &x;

ここまでは順調ですね。これにより、*p (100 を取得) および ++p を実行して、ポインターを x の 1 つ前に設定できます。

そのポインターの逆参照は許可されていません。それ以上の増加も許可されていません。ポインターの計算は、[0] から 1 つ前の末尾までの配列の範囲内で有効であり、ソロ オブジェクトは [1] 配列としてカウントされます。

肝心なのは、最初の反復の後、何かが起こる可能性があるということです。

于 2013-06-30T00:21:05.337 に答える