2016-07-27 8 views
2

C++やCでは、ポインタがメモリの境界から外れるような値に設定されているとどうなりますか?このようなことを行うコードは次のとおりです。ポインタが大きすぎるとどうなりますか?

何が起こりますか?ポインタが境界の外に出たときに、ポインタが16バイトのメモリを言うとしますか?0xFから0x0に反転しますか?それはカウントアップし、*ptr = 10;ラインはコンピュータをクラッシュさせますか?

私は愚かではありませんが、私は非常に興味があります。

+2

「私は試しても馬鹿ではありませんが、私は非常に興味があります。これは適切な答えに取って代わるものではありませんが、メジャーなOSで実行している場合は、アプリケーションの外部で何の害も生じません。 – Thebluefish

+1

はい、ポインタは単なる値のコンテナではなく、ちょうど反転します。あなたの2番目の行には100%UBチャンスがあります。 –

+4

未定義の動作ahoy – user975989

答えて

10

未定義の動作。

実際、ポインターをインクリメントして、最初に指し示したオブジェクトの終わりを超えた1つ以上の要素を指すようにすると、未定義の動作が発生します。 (あなたはオブジェクトの終わりを過ぎてポインタを構築することは許されますが、それを超えてはなりません。)(問題のオブジェクトは配列であり、配列以外のオブジェクトは1つの要素を持つ配列として扱われます)

これは、言語標準が何が起こるかについて何も言わないことを意味します。プログラムがクラッシュする可能性があります。プログラムによって生成される可能性のある症状が発生する可能性があります。

実際には、動作はシステムによって異なる可能性があります。ポインタをインクリメントすると、符号なし整数をインクリメントするのと同じことが起こる可能性があります。目に見える問題を発生させることなく値を更新します。ポインタを間接参照しようとすると、システムがメモリをどのように管理するかによって結果が異なります。

ボトムライン:未定義の動作は未定義です。

+6

オブジェクトの向こう側にポインタポイントを置くことは絶対に許されます。 – EOF

+2

@EOFより具体的には、オブジェクトの「ちょうど」(終わり)ですが。 –

+2

@ EOF:まあまあです。私の言葉は間違っているという点では不器用だった。私はそれを修正しました。 –

1

ポインタは、オブジェクトまたは「1パス」に対してのみ有効です。

int x; 
int *p = &x; 
p++; 
p++; // invalid 
int y[5]; 
p = &y[4]; 
p = &y[5]; 
p = &y[6]; // invalid 

ポインタにはNULLポインタ値を割り当てることができます。

p = NULL; 

ポインタはファンクションを参照することができます。

これだけです。いくつかの他の値へのポインタを割り当てることなど未定義の動作(UB)ある:(new又はmalloc等によって)自分に割り当てられているものの外のメモリにアクセス

int* ptr = 0; 
ptr += 1; // UB (NULL is not a pointer to a valid object, so "1 pass" is UB) 
2

C++で未定義の動作であり、何かがうまくいくとは期待しないでください。

実際には、物理​​限界を超えてポインタをインクリメントすることは、プラットフォームによって定義されます。ほとんどのプラットフォームでは、最終的にロールオーバーされます。それにアクセスするとクラッシュする可能性があります。

最新のOSでは、プロセスが割り当てられていないメモリを読み書きしようとすると、アクセス違反またはセグメンテーションエラーが発生します。

1

C/C++言語は既存のシステム/マシンでは定義されていませんが、抽象的なブラックボックスは現実を無視していません。

0

私が知っている共通のシステム(主に私のシステムである)では、ポインタはunsigned longと非常によく似た動作をします:

int main(){ 
    char* p = NULL; 
    printf("%p\n", p); 
    printf("%p\n", --p); 
} 

出力:

(nil) 
0xffffffffffffffff 

しかし、私はエキゾチックなもののすべての種類を推測するには、理論的には、発生する可能性があります。

0

IMO、あなたのポインタは問題ありません。ただポインタを保存すれば何も起こることはありませんが、逆参照しようとすると、あなたのコードはアクセス違反で終わってクラッシュしてしまいますプログラム。 またはそれが有効なポインタであれば、他のデータを変更する可能性があります。

関連する問題