为什么无效指针与参考值不同

Why is void pointer different from reference value?

本文关键字:参考 无效 指针 为什么      更新时间:2023-10-16
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 *) &(object.data), source, size);

谢谢!

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

object.data的地址是 &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.和指针。

这个问题

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

一旦你让它编译,它就会准确地产生预期的输出,而不是 OP 所说的它产生的输出。

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

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