0

Linuxカーネルは、メモリ書き込み違反が原因でプログラムの実行を終了しますが、同じメモリ位置でのメモリアクセス違反が原因ではありません.

例えば

//x is a pointer to a vector of structs
if( (*x)[i].member )
     break;                   //doesn't crash

if( (*x)[i].member )
    (*x)[i].member = 1;      //crashes, even though member is not used 
                             //elsewhere in the program 
4

2 に答える 2

2

これは、要素が保存されているページが書き込み保護されている場合に発生します。読み取りは許可されていますが、書き込みは許可されていません (また、プロセスが強制終了されます)。

これは、読み取り専用セクションに格納された文字列を変更しようとすると、C および C++ で発生します。

#include <stdio.h>
int main(void)
{
  char *foo = "hello";
  printf("%s\n", foo); // ok
  foo[0] = 'H';        // usually a crash
}
于 2012-07-15T07:26:42.200 に答える
1

配列が読み取り専用メモリ内にある場合 (たとえば、基になるメモリ タイプを読み取り専用に定義するconstか、変更した場合)、配列を変更しようとするとクラッシュする可能性があります。

于 2012-07-15T07:25:47.467 に答える