cout derefernced(unsigned char)指针,给我意想不到的结果

时间:2017-02-16 11:36:28

标签: c++

我需要查看声明的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

但我明白了 buffer =

空白,这让我疯了,甚至没有任何价值!!!

我实际上是如何处理的:

#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 构造一个字节的有效负载数据包,我需要它是指针。 这就是我将问题标记为&#34; C&#34;以及&#34; C ++&#34;,因为该问题的核心也与C有关。但我发现自己被投票支持了!我知道&#34; cout&#34;和&#34;新&#34;是c ++文字,但它与问题无关!!

没有所有问题的编码问题,我的问题就是 unsigned char 然后如果它作为cout的常规字符读取! !!

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

谢谢你们,因为你们让我注意到cout正在处理它,就好像它是一个普通的char,尽管它对我来说是预期的。

3 个答案:

答案 0 :(得分:3)

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

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

输出

buffer = ]

ASCII char 8表示退格,它已经开启了[。 请注意,您不需要将强制转换为无符号字符 - *buffer是无符号字符。

如果您希望它具有字符'8',则需要将其内容设置为8。 不要忘记delete new

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变量中的数值是什么,因此希望<<报告整数值而不是将其作为字符流式传输,请使用强制转换。

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

答案 1 :(得分:1)

'8'是角色8。 8只是一个不可见的角色代码。

尝试编写*buffer = 48;并猜测为什么输出是&#34;缓冲区= 0&#34;基于此table

答案 2 :(得分:0)

刚刚发现 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',有些人可能认为我的意思是