【问题标题】:What does this quote about char pointers mean?这个关于 char 指针的引用是什么意思?
【发布时间】:2011-06-01 01:01:31
【问题描述】:

我读过一段,但我不明白这是什么意思....谁能解释一下?该段落是:

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

【问题讨论】:

  • 我应该说这段话没有抓住重点:)
  • 这个问题很可能是 C,而不是 C++。很少会在 C++ 文本中看到 char * string(在 C++ 中 string 是一种类型,即使在 std 命名空间中它也不会与该声明冲突,大多数人避免调用他们的字符串 string

标签: c++


【解决方案1】:

这意味着你不应该这样做:

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

因为字符和字符指针之间有很大的区别。

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

其余部分解释了一种可能的效果。如果您在char 值是八位的系统中工作,它们将只能保存从 0 到 255 的值(ISO C 标准允许 char 值更大,但这种情况很少见)。从该值集中随机选择的指针不太可能有用。

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

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

【讨论】:

  • 对不起,那是错误的。如果 pCh 是指向字符的指针,您当然可以取消引用它以检索指向的字符。如果不是,字符指针到底有什么用?
  • @Axel,我没有说你不能取消引用它。我说你不应该这样做。我这么说的原因是因为您已将其设置为'A'not "A",在 ASCII 中是 0x41 并且 very 不太可能是有效的指针。仅仅因为你可以做某事并不意味着它是一个好主意:-)
  • 它是一个有效的指针。它不是指向零终止字符串的指针。
  • 也许你应该把char Ch = *pCh;改成strcpy(pCh2, pCh)这样的东西,因为上面对Ch的赋值是完全有效的。
  • so paxdiablo....是不是像 char *pch='a';表示 pch 保存值 97 并且是指向另一个 char 的指针,而 char *pch="avinash";表示 pch 持有指向 avinash 的指针。
【解决方案2】:

我会丢弃这本书或任何你从哪里得到这句话的地方。这可能意味着你不应该尝试这样的事情:

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

【讨论】:

    【解决方案3】:

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

    char c = 'p';
    

    不要尝试取消对 c 的引用,即执行 *c,因为它会导致未定义的行为。

    【讨论】:

      【解决方案4】:

      我有点担心那段的出处——感觉很古老。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-21
        • 2014-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-07
        • 2019-10-20
        • 2012-05-09
        相关资源
        最近更新 更多