【问题标题】:cout derefernced (unsigned char) pointers, gives me unexpected results [duplicate]cout derefernced (unsigned char) 指针,给了我意想不到的结果[重复]
【发布时间】:2017-02-16 11:36:28
【问题描述】:

我需要看一下声明的 unsigned char 指针中的内容,我将我的问题简化为这个简短的示例

#include<iostream>
int main (int argc, char *argv[])
{
    unsigned char * buffer = new unsigned char;
    *buffer = 8;
    std::cout << "buffer = " << (unsigned char) (*buffer) << std::endl;
}

我期待这个输出:buffer = 8

但我明白了 缓冲区 =

空白,让我抓狂,甚至没有任何价值!!!

我实际上是如何处理它的:

#include<iostream>
typedef unsigned char uint8_t;
int main (int argc, char *argv[])
{
    uint8_t * buffer = new uint8_t ;
    *buffer = 8;
    std::cout << "buffer = " << (int) (*buffer) << std::endl;
}

我在ns3中使用这个例子,buffer构造了一个单字节的payload包,我需要它是一个指针。 这就是为什么我实际上将我的问题与“C++”一起标记为“C”,因为问题的核心也与 C 相关。但我发现自己被否决了!我知道“cout”和“new”是 c++ 文字,但这与问题无关!!

这一切都没有编码问题,我的问题就是 unsigned char 那么如果它读取为带有 cout 的常规 char !!!!!! p>

我说我希望它是buffer = 8,因为 unsigned char 是一字节整数。

谢谢你们,因为你们让我注意到 cout 正在处理它,就好像它是一个普通的字符一样,尽管它是我所期望的。

【问题讨论】:

  • 8 是第 8 个字符,而不是字符 8
  • @mahmoud 你不是couting unsigned char 指针。修正标题。
  • @LogicStuff:是的。 *bufferunsigned charunsigned char) (*buffer) 绝对是 unsigned char
  • @barakmanos 不是指针。我应该强调这一点。内存泄漏不应成为此 MCVE 的一部分。
  • @LogicStuff:是的,确实不是指针。

标签: c++


【解决方案1】:

如果我们将您的示例稍微扩展为:

int main(int argc, char *argv[]) {
    unsigned char * buffer = new unsigned char;
    *buffer = 8;
    std::cout << "buffer = [" << (*buffer) << "]\n";
}

输出是

buffer = ]

ASCII 字符 8 表示退格,它破坏了开头[。 请注意,您不需要强制转换为 unsigned char - *buffer 是 unsigned char。

如果你想让它有字符'8',你需要将它的内容设置为8。 别忘了deletenew

int main(int argc, char *argv[]) {
    unsigned char * buffer = new unsigned char;
    *buffer = '8'; //<---- see the single quotes?
    std::cout << "buffer = [" << (*buffer) << "]\n";
    delete buffer;
}

有输出

buffer = [8]

当然,我们并不真正需要这些指针:

int main(int argc, char *argv[]) {
    unsigned char buffer = '8';
    std::cout << "buffer = [" << buffer << "]\n";
}

如果你坚持使用原始字符代码:

int main(int argc, char *argv[]) {
    unsigned char buffer = 56;
    std::cout << "buffer = [" << buffer << "]\n";
}

编辑:

如果您想知道 buffer 变量中的数值是什么,因此希望 &lt;&lt; 报告一个整数值而不是将其作为字符流式传输,请使用强制转换。

int main(int argc, char *argv[]) {
    unsigned char buffer = 56;
    std::cout << "buffer = [" <<static_cast<unsigned int>(buffer) << "]\n";
}

【讨论】:

    【解决方案2】:

    '8' 是字符 8。 8 只是一个不可见字符的代码。

    尝试写*buffer = 48;,并根据table猜测为什么输出是“Buffer = 0”。

    【讨论】:

    • 或者可能是退格:asciitable.com
    • 建议人类清楚的代码怎么样?没有神奇的数字
    • @doctorlove。绝对是退格键。我不太记得我的 ASCII 码。
    • 我查过了。
    • @mahmoudfathy 是的,它是一个字节数,这就是字符在大多数平台上(现在仍然是)编码的方式。内存中的字符只是一个字节,我链接的表让您知道什么数字被解释为什么字符。 ostream 的运算符 &lt;&lt; 是为 unsigned char 实现的,它打印字符而不是数字。如果您想查看数字,请将字符转换为 unsigned int
    【解决方案3】:

    刚刚发现这个unsigned()

    #include<iostream>
    int main (int argc, char *argv[])
    {
        unsigned char * buffer = new unsigned char;
        *buffer = 8;
        std::cout << "buffer = " << unsigned(*buffer) << std::endl;
    }
    

    它给出了我在问题buffer = 8 中想要的输出 这不是buffer = '8',因为有些人可能认为我的意思是

    【讨论】:

    • 这是unsigned int 的C 风格转换(由于历史原因,名称的int 部分是可选的)。
    猜你喜欢
    • 2021-04-22
    • 2021-11-06
    • 2013-03-06
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2017-10-26
    • 2017-11-30
    相关资源
    最近更新 更多