2017-10-25 25 views
1
#include <stdio.h> 

int main() { 
    char *ptr; 

    while(1){ 
    ++ptr; 
    printf("%p\n", ptr); 
    } 
    return 0; 
} 

質問:プログラムがクラッシュするまで、 ヒープを指すポインタを1バイト増加させる必要があります。Cでsegフォールトを引き起こす|ヒープスタック仮想メモリ

私は、一度に1バイトずつ、スタック内のすべてのアドレスを繰り返してsegfaultを作成しようとしています。ただし、コードは実行し続けるだけで、セグメンテーション違反は発生しません。どのように私はsegfaultを引き起こすためにそれを変更することができますか?

+1

ポインタを逆参照することはありません。 segfaultが必要な場合は、 '*((int *)0);を実行してください。 – tkausl

+0

逆参照されていないにもかかわらず、' ptr'がunintialisedなので*未定義の動作*です。 –

+0

ヒープを指すポインタを使うには 'malloc()'を使わなければならないと思います。 'ptr = malloc()'は、ヒープで希望のメモリ位置を取得すると、ptrポインタでヒープにアクセスできます。 – EsmaeelE

答えて

0

ローカル変数のアドレスに設定し、スタックを指すポインタを取得するには:

int main() { 
    int object; 
    int *p = &object; 

しかし、単純にポインタをインクリメントすると、セグメンテーションフォールトが発生することはありません。セグメンテーションフォルトを取得するには、無効なポインタを逆参照する必要があります。

*ptrは最終的に、故障の原因になります印刷しようとし
while(1) { 
     ++ptr; 
     printf("%p %d\n", ptr, *ptr); 
    } 

:だからループは次のようにする必要があります。

ヒープの場合も同様ですが、pをローカル変数のアドレスの代わりにmalloc()を呼び出して初期化します。

+0

すべてのアドレスをループできないのはなぜですか?すべてのアドレスにアクセスせず、値を設定して、最終的にそれがなくなるでしょうか? –

+0

仮想メモリシステムでは、ほとんどのアドレスはマップされていないか、カーネルの一部であるため保護されています。最終的には、アクセスできないブロックにヒットし、セグメンテーション違反の原因となります。 – Barmar

+0

whileループが実行される回数を設定しますか?セグメンテーション・フォルトの前に500回実行すると、1000回ではなく500回実行されたのはなぜですか? –

関連する問題