访问特殊用途的地址的需求一般发生在嵌入式系统上,嵌入式系统对应用程序的介入很少。比如说,在有些底层操作系统内核中,PC的显存地址是0xB8000,这个地址装的是字符模式下显示的第一行第一列的字符,我们可以把这个地址赋给某个指针,然后把某个字符赋给这个地址,代码如下所示。图8-2显示了内存布局。
#define VIDEO_BASE 0xB8000
int *video = (int *) VIDEO_BASE;
*video = 'A';
在适当情况下,可以读取这个地址的内容,不过一般不会对显存地址这么做。
当你需要寻址地址0的内存时,有时候编译器会把它当做NULL
指针值。底层内核程序通常需要访问地址0,有几种技术可以处理这种情况:
- 把指针置为0(不一定能工作);
- 把整数置为0,再把这个整数转换为指针;
- 用8.2.1节中提到的联合体;
- 用
memset
函数把指针置为0。
下面是一个使用memset
函数的例子,这里将ptr
引用的内存置为0:
memset((void*)&ptr, 0, sizeof(ptr));
在需要寻址0地址内存的系统上,厂商一般会有解决问题的办法。