2
int main()
{
    int *p=NULL;
    p=malloc(8);

    if (p==NULL)
        printf("Mem alloc failed\n");
    else
        printf("Passed\n");

    unsigned long int i=0;

    for (i=2;i<=10000;i++)
        p[i]=10;  // I thought as we are increasing beyond malloc size of 8 bytes there should be segmentation fault but I was wrong.

    printf("p[10000]= %d %d\n",p[10000]);

    free(p);
    return 0;
}

for ループ カウントを

pow(2,32) ( for(i=2;i<=((pow(2,32)-1));i++))

どの場合、セグメンテーション違反が発生しますか?

4

2 に答える 2

2

クラッシュが実際に発生するという保証はありません。この種のエラーは、黙って無視されることがよくあります。ランタイム メモリ管理システムの内部構造を格納するために使用されるメモリに書き込み、ヒープを破壊することさえ可能です。結局のところ、これは未定義の動作です - 何も保証されていません。

いずれにせよ、ヒープオーバーフローを一般的に防止することは、広範な研究の対象です。どうやら、現時点では可能ですが、パフォーマンスが大幅に低下します。トピックが興味深いと思われる場合は、「ヒープ オーバーフロー保護」についてグーグルで検索してみてください。最先端の技術や現在の開発に関するさまざまな論文や技術的な説明が見つかる可能性があります。

于 2013-09-11T07:19:08.997 に答える
1

ここで説明したのは未定義の動作であり、例外が発生する可能性があり、無視される可能性があり、動作が未定義であるため、ほぼ何でも行う可能性があります。

誤ったプログラム構造または誤ったデータを使用したときに発生する可能性があるような、この国際規格が要件を課していない動作。

この国際規格が動作の明示的な定義の記述を省略した場合も、未定義の動作が予想される場合があります。

于 2013-09-11T07:21:19.623 に答える