我读过一段但我无法理解这是什么意思....有人可以解释一下吗?该段是:
将单个字符处理为 char * string可能导致致命 运行时错误。 char *字符串是a 指针可能是一个大整数。 但是角色很小 整数(ascii 0-255)。在许多系统上, 取消引用char vaalue导致 错误,因为内存地址低 保留用于特殊目的 作为操作系统中断 处理程序 - 所以“内存违规” 发生。
答案 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的编程机器指南,那么它有一定道理,但我仍然会保持警惕。