【问题标题】:Why is void pointer different from reference value?为什么 void 指针与参考值不同?
【发布时间】:2015-02-19 15:40:00
【问题描述】:
class Class1
{
    int data;
    int *dataPtr;
}

int main()
{
     Class1 object;
     Class1 *objectPtr = &object;
     object.data = 1100;
     object.dataPtr = &(object.data)

     std::cout << object.dataPtr << std::endl;  //0x22aaa4
     std::cout << (void *) (object.data) << std::endl;  //0x1b198
     std::cout << (void *) &(object.data) << std::endl;  //0x22aaa4

为什么(void *) (object.data)object.dataPtr 不同?

如果我想使用 memcpy 将值从其他地方复制到 object.data,我应该使用哪个内存位置?

memcpy( (void *) (object.data), source, size);

memcpy( (void *) &amp;(object.data), source, size);

谢谢!

【问题讨论】:

  • 一个是将整数转换为 void*,另一个是获取该整数的地址。
  • 我在这里没有看到任何参考资料。
  • 这个问题非常令人困惑。首先,您甚至从不使用objectPtr。其次,它不是有效的 C++。
  • 最后,你的中间输出是错误的。在所有系统上,它实际上是十六进制的 1100,或 0x44c。 (虽然从理论上讲,你已经在那里调用了 UB。)

标签: c++ pointers memory reference


【解决方案1】:

因为(void *) (object.data)data的数值重新解释为指针,所以它可以有任何值;并用它做任何事情会导致未定义的行为。 (如 cmets 中所述,如果实现定义的强制转换仅使用数值 1100 作为地址并且未定义的行为不会引起任何意外,则可以预期它是 0x44c。)

object.data的地址是&amp;object.data

如果您使用更安全的强制转换,或者在 memcpy 的情况下使用隐式转换,那么编译器将阻止这种狡猾的转换:

static_cast<void *>(object.data)    // ERROR: int->pointer conversion
static_cast<void *>(&object.data)   // OK: pointer conversion

memcpy(object.data, source, size);  // ERROR: int where pointer expected
memcpy(&object.data, source, size); // OK: pointer converts to void*

一般来说,避免 C 风格的强制转换。和memcpy。和指针。

【讨论】:

  • 不,(void*)(object.data) 不能有任何值,它应该是0x00044c,即1100的数值。而事实上,这正是它所具有的值,如果您修复了发布的代码片段中的错误并运行它。 (正如我为回答所做的那样。)
  • @MikeNakis:转换是实现定义的,使用它是未定义的行为,所以它可以有任何价值。尽管我没有注意到它已设置为特定值;你是对的,这是最有可能的值。
  • 感谢您的解释,现在说得通了。这是代表实际代码的伪代码。实际代码有object.data = 111000;,这就是它输出0x1b198 的原因。当我发布这个时,我没有意识到这是十六进制值。
【解决方案2】:

这个问题是假的。如果不首先修复语法错误,代码甚至无法编译。

一旦你让它编译,它会产生完全预期的输出,而不是 OP 所说的它产生的输出。

这里:http://ideone.com/qXWkGF

Success time: 0 memory: 3096 signal:0
0xbfbd5888
0x44c
0xbfbd5888

【讨论】:

  • 对不起,我只是想它是一个伪代码。实际代码的功能与我发布的类似,但为了简单起见,我只想要一个简单的代码。
猜你喜欢
  • 2013-05-15
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
相关资源
最近更新 更多