繁体   English   中英

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

[英]What does this quote about char pointers mean?

我读过一段,但我不明白这是什么意思。...有人可以解释吗? 该段是:

将单个字符处理为char * string可能导致致命的运行时错误。 一个char *字符串是一个指针,可能是一个大整数。 但是,字符是一个小整数(ASCII 0-255)。 在许多系统上,取消引用字符会导致错误,因为低内存地址是为特殊目的而保留的,例如操作系统中断处理程序,因此会发生“内存冲突”。

这意味着您不应该执行以下操作:

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

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

实际上,当您尝试执行类似操作时,不错的编译器应向您发出警告。

其余的解释了一种可能的效果。 如果您在char值为8位的系统中工作,则它们只能保存0到255(含0和255)之间的值(ISO C标准允许char值更大,但这并不常见)。 从该值集中随机选择的指针很有用的可能性很小。

这并不是完全没有问题的,因为您可能在嵌入式系统中,那里有内存映射的I / O,但在那种情况下,您更有可能使用#define IOPORT7 0x0041类的东西,而使用IOPORT7而不是'A'

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

我会丢掉这本书,或者把它从任何你得到的地方丢掉。 这可能意味着您不应该尝试这样的事情:

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

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

char c = 'p';

不要尝试取消引用c,即执行*c ,因为这将导致不确定的行为。

我对该段的出处有些担心-它看起来很古老。

每个现代操作系统都提供受保护的内存 每个进程都有其自己的地址空间,如果不执行一些相当重要的操作(例如Linux系统上的iopl(2)ioperm(2) ,程序就无法访问物理机的内存不足。

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

当然,如果您正在阅读有关不带MMU的编程机的指南,那么这是有道理的,但是我仍然会保持警惕。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM