C语言访问特殊用途的地址

访问特殊用途的地址的需求一般发生在嵌入式系统上,嵌入式系统对应用程序的介入很少。比如说,在有些底层操作系统内核中,PC的显存地址是0xB8000,这个地址装的是字符模式下显示的第一行第一列的字符,我们可以把这个地址赋给某个指针,然后把某个字符赋给这个地址,代码如下所示。图8-2显示了内存布局。

#define VIDEO_BASE 0xB8000
int *video = (int *) VIDEO_BASE;
*video = 'A';

在PC上寻址显存

在适当情况下,可以读取这个地址的内容,不过一般不会对显存地址这么做。

当你需要寻址地址0的内存时,有时候编译器会把它当做NULL指针值。底层内核程序通常需要访问地址0,有几种技术可以处理这种情况:

  • 把指针置为0(不一定能工作);
  • 把整数置为0,再把这个整数转换为指针;
  • 用8.2.1节中提到的联合体;
  • memset函数把指针置为0。

下面是一个使用memset函数的例子,这里将ptr引用的内存置为0:

memset((void*)&ptr, 0, sizeof(ptr));

在需要寻址0地址内存的系统上,厂商一般会有解决问题的办法。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程