一个有关空指针的问题,求助!!!
最近在重新翻看《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,第一个程序中不是读取了吗?
[解决办法]
int main(){ char *mem = (char *)0; char read = *mem;//你试试这句 return 0;}
[解决办法]
因为printf太智能了
[解决办法]
神奇
细节估计要看汇编了
[解决办法]
他就是说 printf是libc库,所以printf可以读取0 (可能由于libc库的一些实现细节,我认为printf其实他并不一定真的去读取0了,而只是发现是0,就printf null而已)
没必要深究吧。很无聊的这种东西。
这种书也很无聊。