c ++ cout uncasted memory(void)

时间:2012-05-10 16:28:08

标签: c++ casting cout

这就是场景;

// 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该变量,还是有办法直接执行此操作以保存另一个变量?

4 个答案:

答案 0 :(得分:6)

做类似的事情:

// 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());

答案 1 :(得分:1)

这样做:

char* buffer = new char[100];

std::cout << buffer; 
// at some point
delete[] buffer;

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

答案 2 :(得分:1)

您需要将其投放到char*reinterpret_cast<char*>(buffer)。问题是void*表示任何东西,因此只打印指针;当你将它转换为char*时,内存的内容被解释为C风格的字符串

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

注意:当然你可能会得到一个段错误,好像数据确实不是C风格的字符串,可能会访问与缓冲区无关的内存

更新:您可以将内存分配到char*缓冲区开始,它也可以解决您的问题:您仍然可以调用您的第三方功能(char*可以隐式转换为{{1我认为是第三方函数的参数类型),你根本不需要进行演员。最好的办法是将内存清零并限制第三方函数将超过99 * void*个字节复制到缓冲区中以保留结束sizeof(char) C风格的字符串终止符

答案 3 :(得分:1)

如果你想逐字节去,可以使用unsigned char并迭代它。

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

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