C++ COUT 未强制转换内存 (void)

c++ cout uncasted memory (void)

本文关键字:内存 void 转换 COUT C++      更新时间:2023-10-16

这是场景;

// I have created a buffer
void *buffer = operator new(100)
/* later some data from a different buffer is put into the buffer at this pointer
by a function in an external header so I don't know what it's putting in there */
cout << buffer;

我想打印出在此指针处放入缓冲区的数据,以查看输入的内容。我想把它打印出来为原始ASCII,我知道那里会有一些不可打印的字符,但我也知道一些清晰的文本被推到了那里。

从我在互联网上读到的内容来看,cout无法像void那样打印出未投射的数据,而不是intchar。但是,编译器不会让我使用 (char) 例如动态转换它。我应该创建一个单独的变量,将值转换为指针然后cout该变量,还是有没有办法直接执行此操作以保存在另一个变量上?

执行以下操作:

// C++11
std::array<char,100> buf;
// use std::vector<char> for a large or dynamic buffer size
// buf.data() will return a raw pointer suitable for functions
//   expecting a void* or char*
// buf.size() returns the size of the buffer
for (char c : buf)
    std::cout << (isprint(c) ? c : '.');

// C++98
std::vector<char> buf(100);
// The expression `buf.empty() ? NULL : &buf[0]`
//   evaluates to a pointer suitable for functions expecting void* or char*
// The following struct needs to have external linkage
struct print_transform {
    char operator() (char c) { return isprint(c) ? c : '.'; }
};
std::transform(buf.begin(), buf.end(),
               std::ostream_iterator<char>(std::cout, ""),
               print_transform());

这样做:

char* buffer = new char[100];
std::cout << buffer; 
// at some point
delete[] buffer;

void*你只需要在某些情况下,主要是与C接口的互操作,但这绝对不是需要void*的情况,这基本上会丢失所有类型的信息。

您需要

将其转换为char*reinterpret_cast<char*>(buffer) 。 问题是void*代表任何东西,所以只打印第 9 个指针;当你把它投射到char*时,内存的内容被解释为C样式的字符串

注意:使用 reinterpret_cast<> 而不是 C 样式(char *)来明确您的意图并避免以后出现微妙且难以发现的错误

注意:当然,您可能会得到一个段错误,因为如果数据确实不是 C 样式的字符串,可能会访问与缓冲区无关的内存

更新:您可以首先将内存分配给char*缓冲区,它也可以解决您的问题:您仍然可以调用您的 3rd 方函数(char*可以隐式转换为 void*,我认为这是第三方函数的参数类型(,并且您根本不需要进行转换。 最好的办法是将内存清零,并限制第三方函数将超过 99* sizeof(char) 个字节复制到缓冲区中,以保留结尾'' C 样式字符串终止符

如果你想逐个字节地使用,你可以使用一个无符号的字符并迭代它。

unsigned char* currByte = new unsigned char[100];
for(int i = 0; i < 100; ++i)
{
    printf("| %02X |", currByte[i]);
}

这不是一个非常现代(甚至非常"C++"(的答案,但它会为您打印为十六进制值。