2017-10-25 27 views
0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void foo() { 

    char *a_heap_pointer; 
    a_heap_pointer = (char*)malloc(1 * sizeof(char)); 
    strcpy(a_heap_pointer, "a"); 
    printf("%s\n", a_heap_pointer); 

    while (1){ 
     ++a_heap_pointer; 

     a_heap_pointer = (char*)malloc(1 * sizeof(char)); 
     strcpy(a_heap_pointer, "b"); 
     printf("%s\n", a_heap_pointer); 
    } 
} 

int main (void) { 
    foo(); 
    return 0; 
} 

こんにちは、私はCプログラムがヒープをポイントするポインタをインクリメントしてセグメンテーション違反を起こさせようとしています。プログラムがクラッシュするまでしかし、私のコードは今のところ無期限に走っています。私は、ヒープが非常に大きいので、それがそれを実行するためにしばらく時間がかかるだろうと推測します。私のプログラムはヒープを壊すことができますか?Heapcrash - segフォールトによる増分ヒープを指すポインタ

+0

アセンブリを見ましたか? strcpyの呼び出しは、2文字を1文字の長さのバッファにコピーすると、すでに定義されていない動作のようです。コンパイラはこれを単純に無限ループに最適化することができます。 – HeroicKatora

+0

また、 'a_heap_pointer = ...'の直後にある '++ a_heap_pointer'は、インクリメントをノーオペレーションにするので、コンパイラのフラグに依存して、完全に離れて最適化できます。副作用のないコードです。 – twalberg

答えて

0

画面上の印刷はメモリ内の操作に比べて非常に遅いため、printfsを削除すると、おそらく長く待つ必要はありません。

最新のコンピュータには多くのメモリがあり、ディスク上のスワップ領域を考慮すると、数百ギガバイトになる可能性があります。長い間待つ準備をする。

また、Cでは文字列がNULで終了するため、文字列 "a"と "b"の両方に2つの文字が必要です。したがって、strcpyへの呼び出しは、他のものに使用されるメモリを上書きするので、プログラムの動作は未定義です。何かが起こる可能性があります。例えば、つまずくと決して終わることはありません。

もう1つの注意点:++a_heap_pointer;にはどんな効果が期待できますか?そのポインタをインクリメントしますが、インクリメントされた値を即座にmallocの戻り値で置き換えるため、増分演算の結果は決して使用されません。

+0

ヒープの先頭にどこかでメモリを割り当てることができますか?それでクラッシュするのを待つ必要はありませんか? –

+0

いいえ、大きなチャンクを使用してみませんか?一度に1メガバイトが妥当かもしれません。 –

+0

割り当ては1バイト単位で示されます。とにかくヒープの最後のアドレスを見つけることはありますか?私がやっていることは、プログラムがクラッシュし、segフォールトを引き起こしたそのアドレスを書き留めたときです。 –

関連する問題