1

重複の可能性:
無効な読み取り/書き込みにより、セグメンテーション違反が発生する場合と発生しない場合があります

私はmallocでいくつかの実験を行っていて、Linux m/cでこの非常に小さなプログラムを作成しました。

int main(){
    int *p=NULL;
    p = (int *)malloc(10);
    *(p + 33*1000) = 5;
    free(p);
    return 0;
   }

このプログラムはセグメンテーション違反を引き起こしていませんが、5行目をこれに変更すると*(p + 34 * 1000)= 5; 次に、セグメンテーション違反が発生します。私のシステムでは、ページサイズは4Kです。

pの後に約128Kb(34 * 1000は約128K)でセグメンテーション違反が発生する理由を説明できません。

誰かがLinuxのメモリ管理の観点からこれを説明できれば、それは素晴らしいことです。

4

5 に答える 5

4

p両方で割り当てたメモリを超えてアクセスしていますが*(p+33*1000)*(p+34*1000)これは未定義の動作です。「機能する」、クラッシュする、または何かが起こる可能性があるため、推論することはできません。

于 2012-09-04T09:03:27.433 に答える
2

自分で割り当てていないメモリを変更しています。書き込み先のアドレスは、配列の制限をはるかに超えています。配列の境界を超えて書き込むたびに、segfault のリスクが発生します。メモリの場所によって異なります。アドレスによってはセグメンテーション違反にならない場合もありますが、これが良いことであるとは限りません。結果は予測できません。

于 2012-09-04T09:04:28.577 に答える
2

このプログラムは (C 標準に従って) 未定義の動作を示しており、厳密に言えば、それについて他に説明することは何もありません。

言語標準は、特定のプラットフォームの低レベルでメモリ管理をどのように実装するか、または実装する必要があるかについてはまったく説明していません。一部のメモリ領域は、明示的に割り当てなくてもアクセスできます。

于 2012-09-04T09:05:11.107 に答える
0

*(p+0)10 個の整数にスペースを割り当てた後は、これらの 10 個を, *(p+1), ... , *p(p+8),によって逆参照することしかできません*p(p+9)。割り当てた範囲を超えることはもうありません。

他の場所で逆参照すると、無効なポインターを使用しようとしているため、セグメンテーション違反が発生する可能性があります。

于 2012-09-04T09:07:42.340 に答える