Cout删除了(未签名的字符)指针,给了我意外的结果

cout derefernced (unsigned char) pointers, gives me unexpected results

本文关键字:指针 结果 意外 字符 Cout 删除      更新时间:2023-10-16

我需要窥视声明的未签名炭指针中的内容,我将问题减少到了这个简短的示例

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

我期望此输出:缓冲区= 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 中的此示例构建一个字节有效载荷数据包,我需要它是 Pointer 。这就是为什么我实际上将问题与" C "一起标记为" C"的原因,因为问题的核心也很关注C。但是我发现自己拒绝了这一点!我知道" cout"answers" new"是C 文字,但与问题无关!

没有所有的编码问题,我的问题只是 unsigned char ,那么如果它读为常规char,with cout!P>

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

谢谢大家

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

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

输出为

buffer = ]

ASCII CHAR 8表示Backspace,并且已经核定了开场的[。请注意,您不需要演员con - *buffer是一个未签名的char。

如果您希望它具有字符'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变量中的数值值,因此希望<<报告整数值而不是将其作为字符流式传输,请使用cast。

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

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

尝试编写*buffer = 48;,并猜测为什么基于此表的输出为"缓冲区= 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',因为有些人可能以为我的意思是