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 回答