C++ COUT 未强制转换内存 (void)
c++ cout uncasted memory (void)
这是场景;
// 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
那样打印出未投射的数据,而不是int
或char
。但是,编译器不会让我使用 (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++"(的答案,但它会为您打印为十六进制值。
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- <char> 使用 Vulkan 映射内存时如何使用 std::vector 而不是 void**?
- 在带有 (void*) 强制转换的字符串中打印字符的内存地址
- 使用 void 指针:void **ptr.. 如何修改共享内存的值?
- 在 void getData() 中,如何访问由 void* 指针重新调整的内存位置
- C++中带有 void* 的结构的内存分配
- 将内存分配给void*时的gcc-calloc行为
- C++ COUT 未强制转换内存 (void)
- 内存泄漏,带有void*
- C++11内存池类-从void*进行static_casting的解决方法
- 正在将内存分配给二维字符数组,错误:从“void*”到“char**”的转换无效
- 简单(return:void) cout函数返回c++的内存位置
- 在内存中创建一个由void指针指向的对象
- shared_ptr<void> t(new char[num]) 表示内存泄漏?
- 当定义一个将在内存上操作的函数时,将地址传递为void*或uint8*是否更正确?
- :operator delete(void*)是否知道使用::operator new(size_t)分配的内存大小
- 自定义内存分配器:T*指针,运算符new与void指针强制转换
- 从void*拷贝内存