关于char指针的引用是什么意思?

时间:2011-03-08 10:40:25

标签: c++

我读过一段但我无法理解这是什么意思....有人可以解释一下吗?该段是:

  

将单个字符处理为   char * string可能导致致命   运行时错误。 char *字符串是a   指针可能是一个大整数。   但是角色很小   整数(ascii 0-255)。在许多系统上,   取消引用char vaalue导致   错误,因为内存地址低   保留用于特殊目的   作为操作系统中断   处理程序 - 所以“内存违规”   发生。

4 个答案:

答案 0 :(得分:6)

这意味着你不应该做类似的事情:

char *pCh = 'A';  // this is the value 0x41 (assuming ASCII).
char Ch = *pCh;   // probably not what you wanted.

因为字符和字符指针之间存在巨大差异。

事实上,当你尝试做类似的事情时,一个体面的编译器会给你一个警告。

其余部分解释了一个可能的效果。如果您正在一个char值为8位的系统中工作,那么它们只能保存0到255之间的值(ISO C标准允许char值更大,但这种情况相当罕见)。从该值集中随机选择的指针不太可能有用。

它不是完全,因为你可能在一个嵌入式系统上,你有内存映射的I / O,但在这种情况下,你更有可能使用类似于#define IOPORT7 0x0041并使用IOPORT7而不是'A'

另一方面,指针往往能指向整个地址空间,可以是32位宽(或更大)。 32位为您提供了大约四个十亿个可能的值,指针可以指向这些值。

答案 1 :(得分:2)

我会抛弃这本书或者你从那里得到的报价。可能意味着你不应该尝试这样的事情:

char c = 'a';
strcmp(&c,"a"); // might accidentally work on some systems, but behaviour is undefined

答案 2 :(得分:1)

这意味着,如果你有一个字符,即:

char c = 'p';

请勿尝试取消引用c,即执行*c,因为这会导致未定义的行为。

答案 3 :(得分:0)

我有点担心该段的来源 - 感觉非常古老。

每个现代操作系统都提供protected memory。每个进程都有自己的地址空间,而物理机器的低内存可以被程序访问而不执行一些非常重要的操作(例如Linux系统上的iopl(2)ioperm(2)

低内存未映射到进程,因为它是捕获尝试写入NULL指针(实际上是地址0x0)和char变量的最简单方法(而不是char *变量。操作系统可以很好地将虚拟地址0x0的页面映射到它想要的任何内存页面。 (对于古代或神秘系统的兼容模式执行,有时需要映射零页。)

当然,如果您正在阅读没有MMUs的编程机器指南,那么它有一定道理,但我仍然会保持警惕。