【问题标题】:C++ swap content of two void*C++ 交换两个 void* 的内容
【发布时间】:2016-10-24 21:04:13
【问题描述】:

是否可以交换两个 void 指针的内容?我尝试通过取消引用两个指针来交换值:

void* a = (void*)50;
void* b = (void*)90;
*a = *b;

但是,最后一行会引发错误,因为无法取消引用 void 指针。

我认为可以通过首先将 b 的值转换为 int 然后将其转换回 void* 来实现,如下所示:

void* a = (void*)50;
void* b = (void*)90;

int value = (int)b;
a = (void*)value; //a now equals b

不幸的是,这需要我们知道 a 和 b “应该”是什么类型(我不知道这样的描述是否正确),在这种情况下,它们是整数。是否可以在不知道它们的“原始”类型的情况下交换两个 void 指针的内容?

谢谢。

【问题讨论】:

  • std::swap(a, b) 有什么问题?
  • 应避免使用空指针。你为什么要使用它们?
  • 你说的是交换指针还是交换它们指向的对象?
  • 交换它们指向的数据/对象/字节
  • 注意你在这里做了什么:void* a = (void*)50; 这将a 声明为指向void 的指针,并将其指向内存地址 50。它不会在指向的地址存储 50通过a,它使a 指向地址50 的数据,而50 几乎肯定不是一个有效的使用地址。通常前几千个地址是禁止使用的,并且从未使用过,因为它使捕获意外的空指针访问更容易。 *a = *b; 然后将坏内存地址的数据分配给另一个坏内存地址的数据,然后 BOOM

标签: c++ pointers casting void-pointers


【解决方案1】:

不,这是不可能的。为了做这样的事情,关于两个指针指向的对象大小的信息必须在运行时的某个地方出现,但事实并非如此。此外,有些类型不能轻易复制,因此,交换它们的字节可能不会交换它们的值,并可能导致未定义的行为。

【讨论】:

    【解决方案2】:

    是否可以在不知道它们“原始”类型的情况下交换两个 void 指针的内容?

    如果您不了解类型,那么不,这是不可能的。至少,您必须知道类型的大小。这仅对 trivially copyable 类型就足够了。

    【讨论】:

      猜你喜欢
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      相关资源
      最近更新 更多