#include <stdio.h> int main(void) { int *p = 0; printf("%d ", *p); return 0; }
上面的代码,肯定会报段错误,原因是一般进程内0地址都是没有映射的。
在一些系统中,可能会因为边界条件遇到指针(地址)为0的情况,一旦发生段错误,则进程退出或挂起(signal handler)。
其实我们可以把0地址映射一下,这样虽然严格意义来讲逻辑不对,但是至少进程不会挂起
#include <stdio.h> #include <sys/mman.h> int main(void) { int *p = 0; int *rv = mmap(0x0, 0x1000, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0); printf("rv = %x ", (unsigned int)rv); printf("%d ", *p); return 0; }
请注意要使用root账户执行mmap,普通账户调用mmap会返回失败