我知道除非我们对它进行类型转换,否则我们不能取消引用void指针。
void *ptr = call_a_function();
printf("%d",*(int *)ptr);
这会将元素的数据类型(在本例中为其整数)通知给编译器,以便它可以取消引用它所需的空间量(在本例中为4个字节)。
假设我不知道最终的数据类型,但我知道数据类型的大小。我仍然可以仅使用大小(4个字节)而不是数据类型(不使用int)取消引用它吗?
换句话说,有没有办法通过提供要提取的字节数而不是数据类型来告诉编译器要读取多少字节的内存?
编辑 -
我需要交换两个void *指针的内容。
受到交换两个值的常规方式的影响,即将一个指针的值存储在临时变量中,然后继续进行交换。
尝试在不知道数据类型但仅知道其大小的情况下尝试相同的事情(因为具有此交换代码的函数接受变量的大小作为一个参数)。然而,在阅读了答案和评论之后,我意识到我真的不需要取消引用它。可能memcpy
是正确的方法。
答案 0 :(得分:1)
假设我不知道最终的数据类型,但我知道数据类型的大小。我仍然可以仅使用大小(4个字节)而不是数据类型(不使用int)取消引用它吗?
由于您无法推断或假设数据类型,因此您无法取消引用指针一次以获取完整对象。但是,您可以提取每个字节并随意使用它。
void *ptr = call_a_function();
unsigned char* cptr = (unsigned char*)ptr;
for (int i = 0; i < num_bytes; ++i )
{
unsigned char c = cptr[i];
// Use c
}
答案 1 :(得分:1)
在这种情况下,整体不是其各部分的总和。转换不仅为编译器提供了数据的大小,而且还提供了如何解释数据的方式。假设你得到4个字节,这可能是一个由三个字符组成的字符串,带有一个NULL字节或一个有符号整数,可以根据平台编码为big-endian或little-endian。因此,即使您可以告诉编译器要读取/取消引用多少字节,知道大小也不足以正确处理数据。