为什么void指针与参考值不同?

时间:2015-02-19 15:40:01

标签: c++ pointers memory reference

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);

谢谢!

2 个答案:

答案 0 :(得分:3)

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

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。和指针。

答案 1 :(得分:0)

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

一旦你进行编译,就会产生完全预期的输出,而不是OP所说的那样。

此处:http://ideone.com/qXWkGF

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