读书人

一个有关空指针的有关问题

发布时间: 2012-03-17 19:06:28 作者: rapoo

一个有关空指针的问题,求助!!!
最近在重新翻看《Linux程序设计》一书,里面有一个例子,是说访问0位置处的内存的问题:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main()
{
char *mem = (char *)0;

printf("read from memory zero : %s\r\n", mem);
sprintf(mem, "hello");

return 0;
}

这个程序的输出是:
alex@alex-vm ~/work $ ./a.out
read from memory zero: (null)
Segmentation fault

说明是可以读取0位置处的内容的,但是无法写。

然后修改程序为:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main()
{
char mem = *(const char *)0;

printf("read from memory zero");

return 0;
}

这个时候运行程序,输出:
alex@alex-vm ~/work $ ./a.out
Segmentation fault

这个时候连读一下都不行了。

书上说,这是因为:1. 第二个程序使用的不是gnu的libc库了,在程序和内核之间并没有libc库了
2. linux不允许从零地址处读取数据

关于1和2我都不是很明白,关于1,为什么说这个时候没有libc库了?关于2,第一个程序中不是读取了吗?

[解决办法]

C/C++ code
int main(){   char *mem = (char *)0;   char  read = *mem;//你试试这句   return 0;}
[解决办法]
因为printf太智能了
[解决办法]
神奇
细节估计要看汇编了
[解决办法]
他就是说 printf是libc库,所以printf可以读取0 (可能由于libc库的一些实现细节,我认为printf其实他并不一定真的去读取0了,而只是发现是0,就printf null而已)

没必要深究吧。很无聊的这种东西。

这种书也很无聊。

读书人网 >C语言

热点推荐